[INFO] fetching crate typescript-lsp 0.0.4...
[INFO] fixing typescript-lsp-0.0.4 against try#622891a4e29178280638a6b63a8908bde2c0c854+cargoflags=-Zfix-edition=start=2015 for pr-157817-2
[INFO] extracting crate typescript-lsp 0.0.4 into /workspace/builds/worker-2-tc1/source
[INFO] started tweaking crates.io crate typescript-lsp 0.0.4
[INFO] removed 0 missing tests
[INFO] finished tweaking crates.io crate typescript-lsp 0.0.4
[INFO] tweaked toml for crates.io crate typescript-lsp 0.0.4 written to /workspace/builds/worker-2-tc1/source/Cargo.toml
[INFO] validating manifest of crates.io crate typescript-lsp 0.0.4 on toolchain 622891a4e29178280638a6b63a8908bde2c0c854
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+622891a4e29178280638a6b63a8908bde2c0c854" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate typescript-lsp 0.0.4 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+622891a4e29178280638a6b63a8908bde2c0c854" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Updating crates.io index
[INFO] [stderr]  Downloading crates ...
[INFO] [stderr]   Downloaded hybrid-array v0.4.8
[INFO] [stderr]   Downloaded typescript-types v0.0.4
[INFO] [stderr]   Downloaded oak-typescript v0.0.11
[INFO] [stderr]   Downloaded oak-resolver v0.0.11
[INFO] [stderr]   Downloaded oak-symbols v0.0.11
[INFO] [stderr]   Downloaded typescript-ir v0.0.4
[INFO] [stderr]   Downloaded oak-macros v0.0.11
[INFO] [stderr]   Downloaded oak-folding v0.0.11
[INFO] [stderr]   Downloaded oak-vfs v0.0.11
[INFO] [stderr]   Downloaded oak-navigation v0.0.11
[INFO] [stderr]   Downloaded oak-lsp v0.0.11
[INFO] [stderr]   Downloaded oak-json v0.0.11
[INFO] [stderr]   Downloaded typescript v0.0.4
[INFO] [stderr]   Downloaded oak-core v0.0.11
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/source:/opt/rustwide/workdir:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:3a6becf2bc8dde7f3fa57ede90e4f284e72d296796fc446bbb1e2c7cc0530151" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367
[INFO] running `Command { std: "docker" "start" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367" "/opt/rustwide/cargo-home/bin/cargo" "+622891a4e29178280638a6b63a8908bde2c0c854" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=" "-e" "RUSTDOCFLAGS=" "-w" "/opt/rustwide/workdir" "--user" "0:0" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367" "/opt/rustwide/cargo-home/bin/cargo" "+622891a4e29178280638a6b63a8908bde2c0c854" "fix" "--allow-no-vcs" "--allow-dirty" "--frozen" "--all" "--all-targets" "--message-format=json" "-Zfix-edition=start=2015", kill_on_drop: false }`
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking parking_lot_core v0.9.12
[INFO] [stderr]     Checking mio v1.1.1
[INFO] [stderr]     Checking inotify-sys v0.1.5
[INFO] [stderr]     Checking notify-types v2.1.0
[INFO] [stderr]     Checking hybrid-array v0.4.8
[INFO] [stderr]     Checking serde_json v1.0.149
[INFO] [stderr]     Checking serde v1.0.228
[INFO] [stderr]    Compiling oak-macros v0.0.11
[INFO] [stderr]     Checking errno v0.3.14
[INFO] [stderr]     Checking futures-util v0.3.32
[INFO] [stderr]     Checking getrandom v0.4.2
[INFO] [stderr]     Checking icu_provider v2.1.1
[INFO] [stderr]     Checking socket2 v0.6.3
[INFO] [stderr]    Compiling typescript v0.0.4
[INFO] [stderr]     Checking tracing-subscriber v0.3.23
[INFO] [stderr]     Checking inotify v0.11.1
[INFO] [stderr]     Checking rand v0.10.0
[INFO] [stderr]     Checking icu_properties v2.1.2
[INFO] [stderr]     Checking icu_normalizer v2.1.1
[INFO] [stderr]     Checking signal-hook-registry v1.4.8
[INFO] [stderr]     Checking dashmap v6.1.0
[INFO] [stderr]     Checking parking_lot v0.12.5
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]     Checking notify v8.2.0
[INFO] [stderr]     Checking tokio v1.50.0
[INFO] [stderr]     Checking rand v0.9.2
[INFO] [stderr]     Checking crypto-common v0.2.1
[INFO] [stderr]     Checking block-buffer v0.12.0
[INFO] [stderr]     Checking triomphe v0.1.15
[INFO] [stderr]     Checking typescript-types v0.0.4
[INFO] [stderr]     Checking twox-hash v2.1.2
[INFO] [stderr]     Checking typescript-ir v0.0.4
[INFO] [stderr]     Checking idna_adapter v1.2.1
[INFO] [stderr]     Checking idna v1.1.0
[INFO] [stderr]     Checking url v2.5.8
[INFO] [stderr]     Checking oak-core v0.0.11
[INFO] [stderr]     Checking digest v0.11.2
[INFO] [stderr]     Checking sha2 v0.11.0
[INFO] [stderr]     Checking oak-json v0.0.11
[INFO] [stderr]     Checking oak-symbols v0.0.11
[INFO] [stderr]     Checking oak-vfs v0.0.11
[INFO] [stderr]     Checking oak-navigation v0.0.11
[INFO] [stderr]     Checking oak-folding v0.0.11
[INFO] [stderr]     Checking futures-executor v0.3.32
[INFO] [stderr]     Checking futures v0.3.32
[INFO] [stderr]     Checking oak-resolver v0.0.11
[INFO] [stderr]     Checking oak-typescript v0.0.11
[INFO] [stderr]     Checking oak-lsp v0.0.11
[INFO] [stderr]     Checking typescript-lsp v0.0.4 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unused import: `SourcePosition`
[INFO] [stdout]  --> src/lsp/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 |         SourcePosition,
[INFO] [stdout]   |         ^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `thread`
[INFO] [stdout]   --> src/lsp/mod.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 |     thread,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/context.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/matcher.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/sorter.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:165:17
[INFO] [stdout]     |
[INFO] [stdout] 165 |                   /// 字符串跨行（非模板字符串）
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 166 | /                 if let Some(start) = quote_start {
[INFO] [stdout] 167 | |                     diagnostics.push(
[INFO] [stdout] 168 | |                         Diagnostic::error("字符串不能包含未转义的换行符", Range::from(start..idx + 1))
[INFO] [stdout] 169 | |                             .with_fix("使用模板字符串 (`) 或转义换行符"),
[INFO] [stdout] 170 | |                     );
[INFO] [stdout] 171 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout]     = note: `#[warn(unused_doc_comments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:180:5
[INFO] [stdout]     |
[INFO] [stdout] 180 |       /// 检查未闭合的引号
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 181 | /     if in_single_quote {
[INFO] [stdout] 182 | |         if let Some(start) = quote_start {
[INFO] [stdout] 183 | |             diagnostics.push(
[INFO] [stdout] 184 | |                 Diagnostic::error("未闭合的单引号字符串", Range::from(start..content.len())).with_fix("添加 ' 以闭合字符串"),
[INFO] [stdout] ...   |
[INFO] [stdout] 187 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:210:5
[INFO] [stdout]     |
[INFO] [stdout] 210 |     /// 检查分号相关的问题
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 211 |     diagnostics.extend(check_semicolon_issues(content));
[INFO] [stdout]     |     --------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:213:5
[INFO] [stdout]     |
[INFO] [stdout] 213 |     /// 检查关键字使用
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 214 |     diagnostics.extend(check_keyword_usage(content));
[INFO] [stdout]     |     ------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:216:5
[INFO] [stdout]     |
[INFO] [stdout] 216 |     /// 检查 switch 语句
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 217 |     diagnostics.extend(check_switch_statements(content));
[INFO] [stdout]     |     ---------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:219:5
[INFO] [stdout]     |
[INFO] [stdout] 219 |     /// 检查 try-catch 语句
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 220 |     diagnostics.extend(check_try_catch_statements(content));
[INFO] [stdout]     |     ------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:222:5
[INFO] [stdout]     |
[INFO] [stdout] 222 |     /// 检查未使用的导入
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 223 |     diagnostics.extend(check_unused_imports(content));
[INFO] [stdout]     |     ------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:236:9
[INFO] [stdout]     |
[INFO] [stdout] 236 |           /// 检查 return 语句后是否有换行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | /         if trimmed.starts_with("return ") || trimmed == "return" {
[INFO] [stdout] 238 | |             let after_return = trimmed.strip_prefix("return").unwrap_or("").trim();
[INFO] [stdout] 239 | |             if after_return.is_empty() && !line.ends_with(';') {
[INFO] [stdout] 240 | |                 /// 检查下一行是否是表达式
[INFO] [stdout] ...   |
[INFO] [stdout] 247 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:240:17
[INFO] [stdout]     |
[INFO] [stdout] 240 | /                 /// 检查下一行是否是表达式
[INFO] [stdout] 241 | |                 /// 这是一个潜在的自动分号插入问题
[INFO] [stdout]     | |__________________________________________________^
[INFO] [stdout] 242 | /                 diagnostics.push(Diagnostic::warning(
[INFO] [stdout] 243 | |                     "潜在的自动分号插入问题: return 后直接换行",
[INFO] [stdout] 244 | |                     Range::from(offset..offset + line.len()),
[INFO] [stdout] 245 | |                 ));
[INFO] [stdout]     | |__________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 249 |           /// 检查 continue/break 后是否有表达式
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 250 | /         if (trimmed.starts_with("continue ") || trimmed.starts_with("break ")) && !trimmed.ends_with(';') {
[INFO] [stdout] 251 | |             /// continue 和 break 不应该有标签以外的表达式
[INFO] [stdout] 252 | |             let after_keyword = trimmed.strip_prefix("continue").or_else(|| trimmed.strip_prefix("break")).unwrap_or("").trim();
[INFO] [stdout] 253 | |             if !after_keyword.is_empty() && !after_keyword.chars().all(|c| c.is_alphanumeric() || c == '_' || c == '$') {
[INFO] [stdout] ...   |
[INFO] [stdout] 256 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:251:13
[INFO] [stdout]     |
[INFO] [stdout] 251 |             /// continue 和 break 不应该有标签以外的表达式
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 252 |             let after_keyword = trimmed.strip_prefix("continue").or_else(|| trimmed.strip_prefix("break")).unwrap_or("").trim();
[INFO] [stdout]     |             -------------------------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:301:9
[INFO] [stdout]     |
[INFO] [stdout] 301 |           /// 检查 class 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 302 | /         if trimmed.starts_with("class ") {
[INFO] [stdout] 303 | |             let after_class = trimmed.strip_prefix("class").unwrap_or("").trim();
[INFO] [stdout] 304 | |             if after_class.is_empty() {
[INFO] [stdout] 305 | |                 diagnostics.push(Diagnostic::error("class 关键字后需要类名", Range::from(offset..offset + line.len())));
[INFO] [stdout] ...   |
[INFO] [stdout] 314 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:308:17
[INFO] [stdout]     |
[INFO] [stdout] 308 |                 /// 检查是否有类名
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 309 |                 let parts: Vec<&str> = after_class.split_whitespace().collect();
[INFO] [stdout]     |                 ---------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:316:9
[INFO] [stdout]     |
[INFO] [stdout] 316 |           /// 检查 function 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 317 | /         if trimmed.starts_with("function ") {
[INFO] [stdout] 318 | |             let after_function = trimmed.strip_prefix("function").unwrap_or("").trim();
[INFO] [stdout] 319 | |             if after_function.is_empty() {
[INFO] [stdout] 320 | |                 diagnostics.push(Diagnostic::error("function 关键字后需要函数名", Range::from(offset..offset + line.len())));
[INFO] [stdout] ...   |
[INFO] [stdout] 328 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:330:9
[INFO] [stdout]     |
[INFO] [stdout] 330 |           /// 检查 interface 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 331 | /         if trimmed.starts_with("interface ") {
[INFO] [stdout] 332 | |             let after_interface = trimmed.strip_prefix("interface").unwrap_or("").trim();
[INFO] [stdout] 333 | |             if after_interface.is_empty() {
[INFO] [stdout] 334 | |                 diagnostics.push(Diagnostic::error("interface 关键字后需要接口名", Range::from(offset..offset + line.len())));
[INFO] [stdout] 335 | |             }
[INFO] [stdout] 336 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:15:13
[INFO] [stdout]    |
[INFO] [stdout] 15 |               /// 检查变量是否被正确初始化
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 16 | /             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 17 | |                 /// 检查类型注解是否有效
[INFO] [stdout] 18 | |                 if !is_valid_type_annotation(type_annotation) {
[INFO] [stdout] 19 | |                     diagnostics.push(Diagnostic::error(format!("无效的类型注解: {}", type_annotation), symbol.range.clone()));
[INFO] [stdout] 20 | |                 }
[INFO] [stdout] 21 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:17:17
[INFO] [stdout]    |
[INFO] [stdout] 17 |                   /// 检查类型注解是否有效
[INFO] [stdout]    |                   ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 18 | /                 if !is_valid_type_annotation(type_annotation) {
[INFO] [stdout] 19 | |                     diagnostics.push(Diagnostic::error(format!("无效的类型注解: {}", type_annotation), symbol.range.clone()));
[INFO] [stdout] 20 | |                 }
[INFO] [stdout]    | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:23:13
[INFO] [stdout]    |
[INFO] [stdout] 23 |               /// 检查变量类型与初始化值是否匹配
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 24 | /             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] ...  |
[INFO] [stdout] 27 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:29:13
[INFO] [stdout]    |
[INFO] [stdout] 29 |               /// 检查未使用的变量
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 30 | /             if !symbol.is_exported && !is_variable_used(content, &symbol.name) {
[INFO] [stdout] 31 | |                 diagnostics.push(Diagnostic::warning(format!("变量 '{}' 已声明但未使用", symbol.name), symbol.range.clone()));
[INFO] [stdout] 32 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:36:5
[INFO] [stdout]    |
[INFO] [stdout] 36 |     /// 检查变量阴影
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 37 |     diagnostics.extend(check_variable_shadowing(symbol_table));
[INFO] [stdout]    |     ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:46:5
[INFO] [stdout]    |
[INFO] [stdout] 46 |       /// 遍历代码查找函数调用
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 47 | /     for (line_idx, line) in content.lines().enumerate() {
[INFO] [stdout] 48 | |         let line_offset = get_line_offset(content, line_idx);
[INFO] [stdout] 49 | |
[INFO] [stdout] 50 | |         /// 简单检测函数调用模式：函数名后跟括号
[INFO] [stdout] ...  |
[INFO] [stdout] 77 | |     }
[INFO] [stdout]    | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:50:9
[INFO] [stdout]    |
[INFO] [stdout] 50 |           /// 简单检测函数调用模式：函数名后跟括号
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 51 | /         if let Some(call_idx) = line.find('(') {
[INFO] [stdout] 52 | |             if call_idx > 0 {
[INFO] [stdout] 53 | |                 let before_paren = &line[..call_idx];
[INFO] [stdout] 54 | |                 let func_name = before_paren.trim().split_whitespace().last().unwrap_or("");
[INFO] [stdout] ...  |
[INFO] [stdout] 76 | |         }
[INFO] [stdout]    | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:57:21
[INFO] [stdout]    |
[INFO] [stdout] 57 |                       /// 查找函数定义
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 58 | /                     if let Some(symbol) = symbol_table.find_by_name(func_name) {
[INFO] [stdout] 59 | |                         if symbol.kind == SymbolKind::Function {
[INFO] [stdout] 60 | |                             /// 检查参数数量
[INFO] [stdout] 61 | |                             let call_args = extract_argument_count(&line[call_idx..]);
[INFO] [stdout] ...  |
[INFO] [stdout] 73 | |                     }
[INFO] [stdout]    | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:60:29
[INFO] [stdout]    |
[INFO] [stdout] 60 | ...                   /// 检查参数数量
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 | ...                   let call_args = extract_argument_count(&line[call_idx..]);
[INFO] [stdout]    |                       ---------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:103:5
[INFO] [stdout]     |
[INFO] [stdout] 103 |       /// 检查是否是基本类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 104 | /     if valid_types.contains(&trimmed) {
[INFO] [stdout] 105 | |         return true;
[INFO] [stdout] 106 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:108:5
[INFO] [stdout]     |
[INFO] [stdout] 108 |       /// 检查是否是数组类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 109 | /     if trimmed.ends_with("[]") {
[INFO] [stdout] 110 | |         let element_type = &trimmed[..trimmed.len() - 2];
[INFO] [stdout] 111 | |         return is_valid_type_annotation(element_type);
[INFO] [stdout] 112 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:114:5
[INFO] [stdout]     |
[INFO] [stdout] 114 |       /// 检查是否是联合类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 115 | /     if trimmed.contains(" | ") {
[INFO] [stdout] 116 | |         return trimmed.split(" | ").all(|t| is_valid_type_annotation(t.trim()));
[INFO] [stdout] 117 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:119:5
[INFO] [stdout]     |
[INFO] [stdout] 119 |       /// 检查是否是交叉类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 120 | /     if trimmed.contains(" & ") {
[INFO] [stdout] 121 | |         return trimmed.split(" & ").all(|t| is_valid_type_annotation(t.trim()));
[INFO] [stdout] 122 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:129:5
[INFO] [stdout]     |
[INFO] [stdout] 129 |     /// 检查是否是有效的标识符（自定义类型）
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 130 |     is_valid_identifier(trimmed)
[INFO] [stdout]     |     ---------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:138:5
[INFO] [stdout]     |
[INFO] [stdout] 138 |       /// 相同类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 139 | /     if expected == actual {
[INFO] [stdout] 140 | |         return true;
[INFO] [stdout] 141 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:143:5
[INFO] [stdout]     |
[INFO] [stdout] 143 |       /// any 类型兼容所有类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 144 | /     if expected == "any" || actual == "any" {
[INFO] [stdout] 145 | |         return true;
[INFO] [stdout] 146 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:148:5
[INFO] [stdout]     |
[INFO] [stdout] 148 |       /// unknown 可以赋值给任何类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 149 | /     if actual == "unknown" {
[INFO] [stdout] 150 | |         return true;
[INFO] [stdout] 151 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:153:5
[INFO] [stdout]     |
[INFO] [stdout] 153 |       /// never 可以赋值给任何类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 154 | /     if actual == "never" {
[INFO] [stdout] 155 | |         return true;
[INFO] [stdout] 156 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:158:5
[INFO] [stdout]     |
[INFO] [stdout] 158 |       /// 检查联合类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 159 | /     if expected.contains(" | ") {
[INFO] [stdout] 160 | |         return expected.split(" | ").any(|t| types_compatible(t.trim(), actual));
[INFO] [stdout] 161 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:163:5
[INFO] [stdout]     |
[INFO] [stdout] 163 |       /// 检查数组类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 164 | /     if expected.ends_with("[]") && actual.ends_with("[]") {
[INFO] [stdout] 165 | |         let expected_elem = &expected[..expected.len() - 2];
[INFO] [stdout] 166 | |         let actual_elem = &actual[..actual.len() - 2];
[INFO] [stdout] 167 | |         return types_compatible(expected_elem, actual_elem);
[INFO] [stdout] 168 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:170:5
[INFO] [stdout]     |
[INFO] [stdout] 170 |       /// 数字类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 171 | /     if expected == "number" && (actual == "number" || actual.parse::<f64>().is_ok()) {
[INFO] [stdout] 172 | |         return true;
[INFO] [stdout] 173 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:175:5
[INFO] [stdout]     |
[INFO] [stdout] 175 |       /// 字符串类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 176 | /     if expected == "string" && (actual == "string" || actual.starts_with('"') || actual.starts_with('\'')) {
[INFO] [stdout] 177 | |         return true;
[INFO] [stdout] 178 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:180:5
[INFO] [stdout]     |
[INFO] [stdout] 180 |       /// 布尔类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 181 | /     if expected == "boolean" && (actual == "boolean" || actual == "true" || actual == "false") {
[INFO] [stdout] 182 | |         return true;
[INFO] [stdout] 183 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:197:5
[INFO] [stdout]     |
[INFO] [stdout] 197 |       /// 首字符必须是字母、下划线或美元符号
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 198 | /     if !first.is_alphabetic() && first != '_' && first != '$' {
[INFO] [stdout] 199 | |         return false;
[INFO] [stdout] 200 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:202:5
[INFO] [stdout]     |
[INFO] [stdout] 202 |     /// 其余字符必须是字母、数字、下划线或美元符号
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 203 |     chars.all(|c| c.is_alphanumeric() || c == '_' || c == '$')
[INFO] [stdout]     |     ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:208:5
[INFO] [stdout]     |
[INFO] [stdout] 208 |     /// 找到匹配的右括号
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 209 |     let mut depth = 0;
[INFO] [stdout]     |     ------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:237:21
[INFO] [stdout]     |
[INFO] [stdout] 237 |                     /// 找到匹配的右括号
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 238 |                     return if comma_count == 0 && call_expr.trim() == "()" { Some(0) } else { Some(comma_count + 1) };
[INFO] [stdout]     |                     ------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:259:5
[INFO] [stdout]     |
[INFO] [stdout] 259 |       /// 查找函数签名中的参数列表
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 260 | /     if let Some(start) = type_str.find('(') {
[INFO] [stdout] 261 | |         if let Some(end) = type_str.find(')') {
[INFO] [stdout] 262 | |             let params = &type_str[start + 1..end];
[INFO] [stdout] 263 | |             let trimmed = params.trim();
[INFO] [stdout] ...   |
[INFO] [stdout] 273 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:269:13
[INFO] [stdout]     |
[INFO] [stdout] 269 |             /// 计算逗号数量 + 1
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 270 |             let comma_count = trimmed.chars().filter(|&c| c == ',').count();
[INFO] [stdout]     |             ---------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SymbolKind`
[INFO] [stdout]  --> src/lsp/diagnostics/mod.rs:8:27
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::lsp::symbols::{SymbolKind, SymbolTable};
[INFO] [stdout]   |                           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:101:9
[INFO] [stdout]     |
[INFO] [stdout] 101 |         /// 语法错误检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 102 |         diagnostics.extend(self.analyze_syntax_errors(content, change_range));
[INFO] [stdout]     |         --------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:104:9
[INFO] [stdout]     |
[INFO] [stdout] 104 |         /// 类型错误检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 105 |         diagnostics.extend(self.analyze_type_errors(content, change_range));
[INFO] [stdout]     |         ------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:107:9
[INFO] [stdout]     |
[INFO] [stdout] 107 |         /// 未使用符号检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 108 |         diagnostics.extend(self.analyze_unused_symbols(content, change_range));
[INFO] [stdout]     |         ---------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:117:9
[INFO] [stdout]     |
[INFO] [stdout] 117 |         /// 检查括号匹配
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 118 |         diagnostics.extend(syntax_checker::check_bracket_matching(content));
[INFO] [stdout]     |         ------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:120:9
[INFO] [stdout]     |
[INFO] [stdout] 120 |         /// 检查引号匹配
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 121 |         diagnostics.extend(syntax_checker::check_quote_matching(content));
[INFO] [stdout]     |         ----------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:123:9
[INFO] [stdout]     |
[INFO] [stdout] 123 |         /// 检查基本语法结构
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 124 |         diagnostics.extend(syntax_checker::check_basic_syntax(content));
[INFO] [stdout]     |         --------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:138:9
[INFO] [stdout]     |
[INFO] [stdout] 138 |         /// 检查变量类型一致性
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 139 |         diagnostics.extend(type_checker::check_variable_types(content, &self.symbol_table));
[INFO] [stdout]     |         ----------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:141:9
[INFO] [stdout]     |
[INFO] [stdout] 141 |         /// 检查函数调用参数
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 142 |         diagnostics.extend(type_checker::check_function_calls(content, &self.symbol_table));
[INFO] [stdout]     |         ----------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:157:13
[INFO] [stdout]     |
[INFO] [stdout] 157 |               /// 跳过公共导出符号
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 158 | /             if symbol.is_exported {
[INFO] [stdout] 159 | |                 continue;
[INFO] [stdout] 160 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:162:13
[INFO] [stdout]     |
[INFO] [stdout] 162 |               /// 检查符号是否被使用
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 163 | /             if !self.is_symbol_used(content, &symbol.name) {
[INFO] [stdout] 164 | |                 // 如果有修改范围，只检查修改范围内的符号
[INFO] [stdout] 165 | |                 if let Some(range) = change_range {
[INFO] [stdout] 166 | |                     if symbol.range.start >= range.start && symbol.range.end <= range.end {
[INFO] [stdout] ...   |
[INFO] [stdout] 175 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:190:13
[INFO] [stdout]     |
[INFO] [stdout] 190 |               /// 简单检测：统计符号出现次数
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 191 | /             if line.contains(symbol_name) {
[INFO] [stdout] 192 | |                 let line_offset = self.get_line_offset(content, line_idx);
[INFO] [stdout] 193 | |
[INFO] [stdout] 194 | |                 /// 检查是否是声明行
[INFO] [stdout] ...   |
[INFO] [stdout] 204 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:194:17
[INFO] [stdout]     |
[INFO] [stdout] 194 |                   /// 检查是否是声明行
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 195 | /                 if !found_declaration && self.is_declaration_line(line, symbol_name) {
[INFO] [stdout] 196 | |                     found_declaration = true;
[INFO] [stdout] 197 | |                     continue;
[INFO] [stdout] 198 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:200:17
[INFO] [stdout]     |
[INFO] [stdout] 200 |                   /// 检查是否是实际使用（不是注释、字符串中）
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 201 | /                 if self.is_actual_usage(line, symbol_name) {
[INFO] [stdout] 202 | |                     usage_count += 1;
[INFO] [stdout] 203 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:231:9
[INFO] [stdout]     |
[INFO] [stdout] 231 |           /// 跳过注释行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^
[INFO] [stdout] 232 | /         if trimmed.starts_with("//") || trimmed.starts_with("/*") || trimmed.starts_with("*") {
[INFO] [stdout] 233 | |             return false;
[INFO] [stdout] 234 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:236:9
[INFO] [stdout]     |
[INFO] [stdout] 236 |           /// 跳过纯字符串行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | /         if (trimmed.starts_with('"') || trimmed.starts_with('\'')) && (trimmed.ends_with('"') || trimmed.ends_with('\'')) {
[INFO] [stdout] 238 | |             return false;
[INFO] [stdout] 239 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:79:9
[INFO] [stdout]    |
[INFO] [stdout] 79 |         /// 参数名称提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 80 |         hints.extend(self.provide_parameter_name_hints(range_text, range.start));
[INFO] [stdout]    |         ------------------------------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:82:9
[INFO] [stdout]    |
[INFO] [stdout] 82 |         /// 类型推断提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 83 |         hints.extend(self.provide_type_inference_hints(range_text, range.start));
[INFO] [stdout]    |         ------------------------------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         /// 枚举成员值提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 86 |         hints.extend(self.provide_enum_member_hints(range_text, range.start));
[INFO] [stdout]    |         --------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:98:13
[INFO] [stdout]     |
[INFO] [stdout]  98 |               /// 查找函数调用模式
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]  99 | /             if let Some(paren_idx) = line.find('(') {
[INFO] [stdout] 100 | |                 let before_paren = &line[..paren_idx];
[INFO] [stdout] 101 | |                 let func_name = before_paren.trim().split_whitespace().last().unwrap_or("");
[INFO] [stdout] ...   |
[INFO] [stdout] 121 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:104:21
[INFO] [stdout]     |
[INFO] [stdout] 104 |                       /// 尝试从符号表获取函数参数信息
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 105 | /                     if let Some(symbol) = self.symbol_table.find_by_name(func_name) {
[INFO] [stdout] 106 | |                         if symbol.kind == SymbolKind::Function {
[INFO] [stdout] 107 | |                             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 108 | |                                 let params = self.extract_parameter_names(type_annotation);
[INFO] [stdout] ...   |
[INFO] [stdout] 119 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:134:13
[INFO] [stdout]     |
[INFO] [stdout] 134 |               /// 检测使用类型推断的变量声明（没有显式类型注解）
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 135 | /             if (line.trim().starts_with("const ") || line.trim().starts_with("let ") || line.trim().starts_with("var "))
[INFO] [stdout] 136 | |                 && !line.contains(":")
[INFO] [stdout] 137 | |             {
[INFO] [stdout] 138 | |                 /// 提取变量名
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:138:17
[INFO] [stdout]     |
[INFO] [stdout] 138 |                   /// 提取变量名
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^
[INFO] [stdout] 139 | /                 if let Some(var_name) = self.extract_variable_name(line) {
[INFO] [stdout] 140 | |                     /// 查找符号表中的类型信息
[INFO] [stdout] 141 | |                     if let Some(symbol) = self.symbol_table.find_by_name(&var_name) {
[INFO] [stdout] 142 | |                         if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] ...   |
[INFO] [stdout] 153 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:140:21
[INFO] [stdout]     |
[INFO] [stdout] 140 |                       /// 查找符号表中的类型信息
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 141 | /                     if let Some(symbol) = self.symbol_table.find_by_name(&var_name) {
[INFO] [stdout] 142 | |                         if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 143 | |                             /// 在变量名后添加类型提示
[INFO] [stdout] 144 | |                             if let Some(var_end) = line.find(&var_name) {
[INFO] [stdout] ...   |
[INFO] [stdout] 152 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:143:29
[INFO] [stdout]     |
[INFO] [stdout] 143 |   ...                   /// 在变量名后添加类型提示
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 144 | / ...                   if let Some(var_end) = line.find(&var_name) {
[INFO] [stdout] 145 | | ...                       let var_end_pos = var_end + var_name.len();
[INFO] [stdout] 146 | | ...                       hints.push(InlayHint::type_inference(
[INFO] [stdout] 147 | | ...                           base_offset + line_offset + var_end_pos,
[INFO] [stdout] 148 | | ...                           type_annotation.clone(),
[INFO] [stdout] 149 | | ...                       ));
[INFO] [stdout] 150 | | ...                   }
[INFO] [stdout]     | |_______________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:170:13
[INFO] [stdout]     |
[INFO] [stdout] 170 |               /// 检测枚举开始
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 171 | /             if trimmed.starts_with("enum ") {
[INFO] [stdout] 172 | |                 in_enum = true;
[INFO] [stdout] 173 | |                 enum_value = 0;
[INFO] [stdout] 174 | |                 continue;
[INFO] [stdout] 175 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:177:13
[INFO] [stdout]     |
[INFO] [stdout] 177 |               /// 检测枚举结束
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 178 | /             if in_enum && trimmed.starts_with('}') {
[INFO] [stdout] 179 | |                 in_enum = false;
[INFO] [stdout] 180 | |                 continue;
[INFO] [stdout] 181 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |               /// 在枚举内部检测成员
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 184 | /             if in_enum && !trimmed.is_empty() && !trimmed.starts_with("//") {
[INFO] [stdout] 185 | |                 /// 检查是否已经有显式值
[INFO] [stdout] 186 | |                 if !trimmed.contains('=') {
[INFO] [stdout] 187 | |                     /// 提取成员名
[INFO] [stdout] ...   |
[INFO] [stdout] 211 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:185:17
[INFO] [stdout]     |
[INFO] [stdout] 185 |                   /// 检查是否已经有显式值
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 186 | /                 if !trimmed.contains('=') {
[INFO] [stdout] 187 | |                     /// 提取成员名
[INFO] [stdout] 188 | |                     if let Some(member_name) = trimmed.split(|c: char| c == ',' || c == ' ' || c == '\t').next() {
[INFO] [stdout] 189 | |                         if !member_name.is_empty() && !member_name.starts_with("//") {
[INFO] [stdout] ...   |
[INFO] [stdout] 210 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:187:21
[INFO] [stdout]     |
[INFO] [stdout] 187 |                       /// 提取成员名
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^
[INFO] [stdout] 188 | /                     if let Some(member_name) = trimmed.split(|c: char| c == ',' || c == ' ' || c == '\t').next() {
[INFO] [stdout] 189 | |                         if !member_name.is_empty() && !member_name.starts_with("//") {
[INFO] [stdout] 190 | |                             /// 在成员名后添加值提示
[INFO] [stdout] 191 | |                             if let Some(name_end) = line.find(member_name) {
[INFO] [stdout] ...   |
[INFO] [stdout] 200 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:190:29
[INFO] [stdout]     |
[INFO] [stdout] 190 |   ...                   /// 在成员名后添加值提示
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 191 | / ...                   if let Some(name_end) = line.find(member_name) {
[INFO] [stdout] 192 | | ...                       let name_end_pos = name_end + member_name.len();
[INFO] [stdout] 193 | | ...                       hints.push(InlayHint::enum_value(
[INFO] [stdout] 194 | | ...                           base_offset + line_offset + name_end_pos,
[INFO] [stdout] ...   |
[INFO] [stdout] 197 | | ...                       enum_value += 1;
[INFO] [stdout] 198 | | ...                   }
[INFO] [stdout]     | |_______________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:203:21
[INFO] [stdout]     |
[INFO] [stdout] 203 |                       /// 如果有显式值，解析并更新 enum_value
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 204 | /                     if let Some(eq_pos) = trimmed.find('=') {
[INFO] [stdout] 205 | |                         let value_str = &trimmed[eq_pos + 1..].trim();
[INFO] [stdout] 206 | |                         if let Ok(val) = value_str.trim_matches(|c| c == ',' || c == ' ').parse::<i32>() {
[INFO] [stdout] 207 | |                             enum_value = val + 1;
[INFO] [stdout] 208 | |                         }
[INFO] [stdout] 209 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:221:9
[INFO] [stdout]     |
[INFO] [stdout] 221 |           /// 查找括号内的参数列表
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 222 | /         if let Some(start) = type_annotation.find('(') {
[INFO] [stdout] 223 | |             if let Some(end) = type_annotation.find(')') {
[INFO] [stdout] 224 | |                 let params_str = &type_annotation[start + 1..end];
[INFO] [stdout] ...   |
[INFO] [stdout] 242 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:226:17
[INFO] [stdout]     |
[INFO] [stdout] 226 |                   /// 分割参数
[INFO] [stdout]     |                   ^^^^^^^^^^^^
[INFO] [stdout] 227 | /                 for param in params_str.split(',') {
[INFO] [stdout] 228 | |                     let param = param.trim();
[INFO] [stdout] 229 | |                     if !param.is_empty() {
[INFO] [stdout] 230 | |                         /// 提取参数名（冒号前的部分）
[INFO] [stdout] ...   |
[INFO] [stdout] 240 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:230:25
[INFO] [stdout]     |
[INFO] [stdout] 230 |                           /// 提取参数名（冒号前的部分）
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 231 | /                         if let Some(colon_pos) = param.find(':') {
[INFO] [stdout] 232 | |                             let param_name = param[..colon_pos].trim();
[INFO] [stdout] 233 | |                             params.push(param_name.to_string());
[INFO] [stdout] ...   |
[INFO] [stdout] 237 | |                             params.push(param.to_string());
[INFO] [stdout] 238 | |                         }
[INFO] [stdout]     | |_________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:236:29
[INFO] [stdout]     |
[INFO] [stdout] 236 | ...                   /// 没有类型注解，整个作为参数名
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | ...                   params.push(param.to_string());
[INFO] [stdout]     |                       ------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:281:25
[INFO] [stdout]     |
[INFO] [stdout] 281 |                           /// 记录最后一个参数
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 282 | /                         if found_first {
[INFO] [stdout] 283 | |                             positions.push(paren_start + 1 + arg_start);
[INFO] [stdout] 284 | |                         }
[INFO] [stdout]     | |_________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:314:9
[INFO] [stdout]     |
[INFO] [stdout] 314 |           /// 移除 const/let/var
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 315 | /         let after_keyword = if trimmed.starts_with("const ") {
[INFO] [stdout] 316 | |             &trimmed[6..]
[INFO] [stdout] 317 | |         }
[INFO] [stdout] 318 | |         else if trimmed.starts_with("let ") {
[INFO] [stdout] ...   |
[INFO] [stdout] 325 | |             return None;
[INFO] [stdout] 326 | |         };
[INFO] [stdout]     | |__________- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:328:9
[INFO] [stdout]     |
[INFO] [stdout] 328 |         /// 提取变量名（直到空格、等号、冒号等）
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 329 |         let name: String = after_keyword.chars().take_while(|&c| c.is_alphanumeric() || c == '_' || c == '$').collect();
[INFO] [stdout]     |         ---------------------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Scope`
[INFO] [stdout]  --> src/lsp/symbols/collector.rs:5:13
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::{Scope, ScopeType, Symbol, SymbolKind, SymbolTable};
[INFO] [stdout]   |             ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:688:9
[INFO] [stdout]     |
[INFO] [stdout] 688 |           /// 首先尝试使用符号表来查找引用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 689 | /         if let Some(symbol_table) = self.get_symbol_table(uri) {
[INFO] [stdout] 690 | |             for symbol in symbol_table.find_all_by_name(symbol_name) {
[INFO] [stdout] 691 | |                 let location = LocationRange { uri: Arc::from(uri), range: symbol.range.clone() };
[INFO] [stdout] 692 | |                 let key = (uri, symbol.range.start, symbol.range.end);
[INFO] [stdout] ...   |
[INFO] [stdout] 697 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:699:9
[INFO] [stdout]     |
[INFO] [stdout] 699 |           /// 然后使用基于文本的查找作为补充
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 700 | /         for (line_idx, line) in content.lines().enumerate() {
[INFO] [stdout] 701 | |             let mut current_pos = 0;
[INFO] [stdout] 702 | |             while let Some(start) = line[current_pos..].find(symbol_name) {
[INFO] [stdout] 703 | |                 let actual_start = current_pos + start;
[INFO] [stdout] ...   |
[INFO] [stdout] 720 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:710:21
[INFO] [stdout]     |
[INFO] [stdout] 710 |                     /// 检查是否已经添加过这个引用
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 711 |                     let key = (uri, start_offset, end_offset);
[INFO] [stdout]     |                     ------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:729:9
[INFO] [stdout]     |
[INFO] [stdout] 729 |         /// 检查后面是否有赋值操作符
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 730 |         let trimmed = after_symbol.trim_start();
[INFO] [stdout]     |         ---------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1032:13
[INFO] [stdout]      |
[INFO] [stdout] 1032 |               /// 首先尝试从当前文件的符号表获取定义位置
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1033 | /             if let Some(symbol_table) = self.get_symbol_table(uri) {
[INFO] [stdout] 1034 | |                 if let Some(symbol) = symbol_table.find_by_name(&symbol_name) {
[INFO] [stdout] 1035 | |                     locations.push(LocationRange { uri: Arc::from(uri), range: symbol.range.clone() });
[INFO] [stdout] 1036 | |                     return locations;
[INFO] [stdout] 1037 | |                 }
[INFO] [stdout] 1038 | |             }
[INFO] [stdout]      | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1040:13
[INFO] [stdout]      |
[INFO] [stdout] 1040 |             /// 跨文件查找符号定义
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1041 |             let all_uris = self.get_all_document_uris();
[INFO] [stdout]      |             -------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1055:13
[INFO] [stdout]      |
[INFO] [stdout] 1055 |             /// 回退到基于文本的查找（当前文件）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1056 |             let lines: Vec<&str> = content.lines().collect();
[INFO] [stdout]      |             ------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1090:13
[INFO] [stdout]      |
[INFO] [stdout] 1090 |             /// 1. 先在当前文件中查找引用
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1091 |             references.extend(self.find_references_in_file(uri, &content, &symbol_name));
[INFO] [stdout]      |             ---------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1093:13
[INFO] [stdout]      |
[INFO] [stdout] 1093 |             /// 2. 然后在所有其他文件中查找引用（并行处理）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1094 |             let all_uris = self.get_all_document_uris();
[INFO] [stdout]      |             -------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1293:13
[INFO] [stdout]      |
[INFO] [stdout] 1293 |             /// 获取符号表用于语义高亮
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1294 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |             ------------------------------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1296:13
[INFO] [stdout]      |
[INFO] [stdout] 1296 | /             /// 使用 highlighter 模块进行语法高亮
[INFO] [stdout] 1297 | |             /// 这里我们返回一个空的实现
[INFO] [stdout]      | |________________________________________^
[INFO] [stdout] 1298 |               Some(SemanticTokens { data: Vec::new(), result_id: None })
[INFO] [stdout]      |               ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1313:13
[INFO] [stdout]      |
[INFO] [stdout] 1313 |             /// 获取或创建符号表
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1314 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |             ------------------------------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1316:13
[INFO] [stdout]      |
[INFO] [stdout] 1316 |             /// 创建内联提示提供者
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1317 |             let provider = InlayHintProvider::new(symbol_table);
[INFO] [stdout]      |             ---------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1319:13
[INFO] [stdout]      |
[INFO] [stdout] 1319 |             /// 提供内联提示
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 1320 |             let hints = provider.provide_hints(&content, range);
[INFO] [stdout]      |             ---------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1322:13
[INFO] [stdout]      |
[INFO] [stdout] 1322 |               /// 转换为 LSP InlayHint 格式
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1323 | /             hints
[INFO] [stdout] 1324 | |                 .into_iter()
[INFO] [stdout] 1325 | |                 .map(|hint| {
[INFO] [stdout] 1326 | |                     let position = self.offset_to_position(&content, hint.position);
[INFO] [stdout] ...    |
[INFO] [stdout] 1338 | |                 })
[INFO] [stdout] 1339 | |                 .collect()
[INFO] [stdout]      | |__________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1398:13
[INFO] [stdout]      |
[INFO] [stdout] 1398 |               /// 获取或更新符号表
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1399 | /             let symbol_table = self.get_symbol_table(uri).unwrap_or_else(|| {
[INFO] [stdout] 1400 | |                 self.update_symbol_table(uri, &content);
[INFO] [stdout] 1401 | |                 self.get_symbol_table(uri).unwrap_or_default()
[INFO] [stdout] 1402 | |             });
[INFO] [stdout]      | |_______________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1404:13
[INFO] [stdout]      |
[INFO] [stdout] 1404 |               /// 获取修改范围
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 1405 | /             let change_range = {
[INFO] [stdout] 1406 | |                 let changes = self.document_changes.read().unwrap();
[INFO] [stdout] 1407 | |                 changes.get(uri).cloned().unwrap_or(None)
[INFO] [stdout] 1408 | |             };
[INFO] [stdout]      | |______________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1410:13
[INFO] [stdout]      |
[INFO] [stdout] 1410 |             /// 创建诊断分析器
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1411 |             let analyzer = DiagnosticAnalyzer::new(symbol_table);
[INFO] [stdout]      |             ----------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1413:13
[INFO] [stdout]      |
[INFO] [stdout] 1413 |             /// 分析诊断（使用增量诊断）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1414 |             let diagnostics = analyzer.analyze_with_range(&content, change_range);
[INFO] [stdout]      |             ---------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1416:13
[INFO] [stdout]      |
[INFO] [stdout] 1416 |               /// 转换为 LSP Diagnostic 格式
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1417 | /             let result: Vec<Diagnostic> = diagnostics
[INFO] [stdout] 1418 | |                 .into_iter()
[INFO] [stdout] 1419 | |                 .map(|d| {
[INFO] [stdout] 1420 | |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout] ...    |
[INFO] [stdout] 1435 | |                 })
[INFO] [stdout] 1436 | |                 .collect();
[INFO] [stdout]      | |___________________________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SourcePosition`
[INFO] [stdout]  --> src/lsp/mod.rs:9:9
[INFO] [stdout]   |
[INFO] [stdout] 9 |         SourcePosition,
[INFO] [stdout]   |         ^^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `thread`
[INFO] [stdout]   --> src/lsp/mod.rs:18:5
[INFO] [stdout]    |
[INFO] [stdout] 18 |     thread,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/context.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/matcher.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `super::*`
[INFO] [stdout]  --> src/lsp/completion/sorter.rs:5:5
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::*;
[INFO] [stdout]   |     ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:165:17
[INFO] [stdout]     |
[INFO] [stdout] 165 |                   /// 字符串跨行（非模板字符串）
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 166 | /                 if let Some(start) = quote_start {
[INFO] [stdout] 167 | |                     diagnostics.push(
[INFO] [stdout] 168 | |                         Diagnostic::error("字符串不能包含未转义的换行符", Range::from(start..idx + 1))
[INFO] [stdout] 169 | |                             .with_fix("使用模板字符串 (`) 或转义换行符"),
[INFO] [stdout] 170 | |                     );
[INFO] [stdout] 171 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout]     = note: `#[warn(unused_doc_comments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:180:5
[INFO] [stdout]     |
[INFO] [stdout] 180 |       /// 检查未闭合的引号
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 181 | /     if in_single_quote {
[INFO] [stdout] 182 | |         if let Some(start) = quote_start {
[INFO] [stdout] 183 | |             diagnostics.push(
[INFO] [stdout] 184 | |                 Diagnostic::error("未闭合的单引号字符串", Range::from(start..content.len())).with_fix("添加 ' 以闭合字符串"),
[INFO] [stdout] ...   |
[INFO] [stdout] 187 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:210:5
[INFO] [stdout]     |
[INFO] [stdout] 210 |     /// 检查分号相关的问题
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 211 |     diagnostics.extend(check_semicolon_issues(content));
[INFO] [stdout]     |     --------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:213:5
[INFO] [stdout]     |
[INFO] [stdout] 213 |     /// 检查关键字使用
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 214 |     diagnostics.extend(check_keyword_usage(content));
[INFO] [stdout]     |     ------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:216:5
[INFO] [stdout]     |
[INFO] [stdout] 216 |     /// 检查 switch 语句
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 217 |     diagnostics.extend(check_switch_statements(content));
[INFO] [stdout]     |     ---------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:219:5
[INFO] [stdout]     |
[INFO] [stdout] 219 |     /// 检查 try-catch 语句
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 220 |     diagnostics.extend(check_try_catch_statements(content));
[INFO] [stdout]     |     ------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:222:5
[INFO] [stdout]     |
[INFO] [stdout] 222 |     /// 检查未使用的导入
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 223 |     diagnostics.extend(check_unused_imports(content));
[INFO] [stdout]     |     ------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:236:9
[INFO] [stdout]     |
[INFO] [stdout] 236 |           /// 检查 return 语句后是否有换行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | /         if trimmed.starts_with("return ") || trimmed == "return" {
[INFO] [stdout] 238 | |             let after_return = trimmed.strip_prefix("return").unwrap_or("").trim();
[INFO] [stdout] 239 | |             if after_return.is_empty() && !line.ends_with(';') {
[INFO] [stdout] 240 | |                 /// 检查下一行是否是表达式
[INFO] [stdout] ...   |
[INFO] [stdout] 247 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:240:17
[INFO] [stdout]     |
[INFO] [stdout] 240 | /                 /// 检查下一行是否是表达式
[INFO] [stdout] 241 | |                 /// 这是一个潜在的自动分号插入问题
[INFO] [stdout]     | |__________________________________________________^
[INFO] [stdout] 242 | /                 diagnostics.push(Diagnostic::warning(
[INFO] [stdout] 243 | |                     "潜在的自动分号插入问题: return 后直接换行",
[INFO] [stdout] 244 | |                     Range::from(offset..offset + line.len()),
[INFO] [stdout] 245 | |                 ));
[INFO] [stdout]     | |__________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:249:9
[INFO] [stdout]     |
[INFO] [stdout] 249 |           /// 检查 continue/break 后是否有表达式
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 250 | /         if (trimmed.starts_with("continue ") || trimmed.starts_with("break ")) && !trimmed.ends_with(';') {
[INFO] [stdout] 251 | |             /// continue 和 break 不应该有标签以外的表达式
[INFO] [stdout] 252 | |             let after_keyword = trimmed.strip_prefix("continue").or_else(|| trimmed.strip_prefix("break")).unwrap_or("").trim();
[INFO] [stdout] 253 | |             if !after_keyword.is_empty() && !after_keyword.chars().all(|c| c.is_alphanumeric() || c == '_' || c == '$') {
[INFO] [stdout] ...   |
[INFO] [stdout] 256 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:251:13
[INFO] [stdout]     |
[INFO] [stdout] 251 |             /// continue 和 break 不应该有标签以外的表达式
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 252 |             let after_keyword = trimmed.strip_prefix("continue").or_else(|| trimmed.strip_prefix("break")).unwrap_or("").trim();
[INFO] [stdout]     |             -------------------------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:301:9
[INFO] [stdout]     |
[INFO] [stdout] 301 |           /// 检查 class 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 302 | /         if trimmed.starts_with("class ") {
[INFO] [stdout] 303 | |             let after_class = trimmed.strip_prefix("class").unwrap_or("").trim();
[INFO] [stdout] 304 | |             if after_class.is_empty() {
[INFO] [stdout] 305 | |                 diagnostics.push(Diagnostic::error("class 关键字后需要类名", Range::from(offset..offset + line.len())));
[INFO] [stdout] ...   |
[INFO] [stdout] 314 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:308:17
[INFO] [stdout]     |
[INFO] [stdout] 308 |                 /// 检查是否有类名
[INFO] [stdout]     |                 ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 309 |                 let parts: Vec<&str> = after_class.split_whitespace().collect();
[INFO] [stdout]     |                 ---------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:316:9
[INFO] [stdout]     |
[INFO] [stdout] 316 |           /// 检查 function 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 317 | /         if trimmed.starts_with("function ") {
[INFO] [stdout] 318 | |             let after_function = trimmed.strip_prefix("function").unwrap_or("").trim();
[INFO] [stdout] 319 | |             if after_function.is_empty() {
[INFO] [stdout] 320 | |                 diagnostics.push(Diagnostic::error("function 关键字后需要函数名", Range::from(offset..offset + line.len())));
[INFO] [stdout] ...   |
[INFO] [stdout] 328 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:330:9
[INFO] [stdout]     |
[INFO] [stdout] 330 |           /// 检查 interface 关键字使用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 331 | /         if trimmed.starts_with("interface ") {
[INFO] [stdout] 332 | |             let after_interface = trimmed.strip_prefix("interface").unwrap_or("").trim();
[INFO] [stdout] 333 | |             if after_interface.is_empty() {
[INFO] [stdout] 334 | |                 diagnostics.push(Diagnostic::error("interface 关键字后需要接口名", Range::from(offset..offset + line.len())));
[INFO] [stdout] 335 | |             }
[INFO] [stdout] 336 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: the feature `new_range_api` has been stable since 1.96.0 and no longer requires an attribute to enable
[INFO] [stdout]  --> src/lib.rs:1:12
[INFO] [stdout]   |
[INFO] [stdout] 1 | #![feature(new_range_api)]
[INFO] [stdout]   |            ^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(stable_features)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:15:13
[INFO] [stdout]    |
[INFO] [stdout] 15 |               /// 检查变量是否被正确初始化
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 16 | /             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 17 | |                 /// 检查类型注解是否有效
[INFO] [stdout] 18 | |                 if !is_valid_type_annotation(type_annotation) {
[INFO] [stdout] 19 | |                     diagnostics.push(Diagnostic::error(format!("无效的类型注解: {}", type_annotation), symbol.range.clone()));
[INFO] [stdout] 20 | |                 }
[INFO] [stdout] 21 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:17:17
[INFO] [stdout]    |
[INFO] [stdout] 17 |                   /// 检查类型注解是否有效
[INFO] [stdout]    |                   ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 18 | /                 if !is_valid_type_annotation(type_annotation) {
[INFO] [stdout] 19 | |                     diagnostics.push(Diagnostic::error(format!("无效的类型注解: {}", type_annotation), symbol.range.clone()));
[INFO] [stdout] 20 | |                 }
[INFO] [stdout]    | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:23:13
[INFO] [stdout]    |
[INFO] [stdout] 23 |               /// 检查变量类型与初始化值是否匹配
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 24 | /             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] ...  |
[INFO] [stdout] 27 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:29:13
[INFO] [stdout]    |
[INFO] [stdout] 29 |               /// 检查未使用的变量
[INFO] [stdout]    |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 30 | /             if !symbol.is_exported && !is_variable_used(content, &symbol.name) {
[INFO] [stdout] 31 | |                 diagnostics.push(Diagnostic::warning(format!("变量 '{}' 已声明但未使用", symbol.name), symbol.range.clone()));
[INFO] [stdout] 32 | |             }
[INFO] [stdout]    | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:36:5
[INFO] [stdout]    |
[INFO] [stdout] 36 |     /// 检查变量阴影
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout] 37 |     diagnostics.extend(check_variable_shadowing(symbol_table));
[INFO] [stdout]    |     ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:46:5
[INFO] [stdout]    |
[INFO] [stdout] 46 |       /// 遍历代码查找函数调用
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 47 | /     for (line_idx, line) in content.lines().enumerate() {
[INFO] [stdout] 48 | |         let line_offset = get_line_offset(content, line_idx);
[INFO] [stdout] 49 | |
[INFO] [stdout] 50 | |         /// 简单检测函数调用模式：函数名后跟括号
[INFO] [stdout] ...  |
[INFO] [stdout] 77 | |     }
[INFO] [stdout]    | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:50:9
[INFO] [stdout]    |
[INFO] [stdout] 50 |           /// 简单检测函数调用模式：函数名后跟括号
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 51 | /         if let Some(call_idx) = line.find('(') {
[INFO] [stdout] 52 | |             if call_idx > 0 {
[INFO] [stdout] 53 | |                 let before_paren = &line[..call_idx];
[INFO] [stdout] 54 | |                 let func_name = before_paren.trim().split_whitespace().last().unwrap_or("");
[INFO] [stdout] ...  |
[INFO] [stdout] 76 | |         }
[INFO] [stdout]    | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:57:21
[INFO] [stdout]    |
[INFO] [stdout] 57 |                       /// 查找函数定义
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 58 | /                     if let Some(symbol) = symbol_table.find_by_name(func_name) {
[INFO] [stdout] 59 | |                         if symbol.kind == SymbolKind::Function {
[INFO] [stdout] 60 | |                             /// 检查参数数量
[INFO] [stdout] 61 | |                             let call_args = extract_argument_count(&line[call_idx..]);
[INFO] [stdout] ...  |
[INFO] [stdout] 73 | |                     }
[INFO] [stdout]    | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:60:29
[INFO] [stdout]    |
[INFO] [stdout] 60 | ...                   /// 检查参数数量
[INFO] [stdout]    |                       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 61 | ...                   let call_args = extract_argument_count(&line[call_idx..]);
[INFO] [stdout]    |                       ---------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:103:5
[INFO] [stdout]     |
[INFO] [stdout] 103 |       /// 检查是否是基本类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 104 | /     if valid_types.contains(&trimmed) {
[INFO] [stdout] 105 | |         return true;
[INFO] [stdout] 106 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:108:5
[INFO] [stdout]     |
[INFO] [stdout] 108 |       /// 检查是否是数组类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 109 | /     if trimmed.ends_with("[]") {
[INFO] [stdout] 110 | |         let element_type = &trimmed[..trimmed.len() - 2];
[INFO] [stdout] 111 | |         return is_valid_type_annotation(element_type);
[INFO] [stdout] 112 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:114:5
[INFO] [stdout]     |
[INFO] [stdout] 114 |       /// 检查是否是联合类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 115 | /     if trimmed.contains(" | ") {
[INFO] [stdout] 116 | |         return trimmed.split(" | ").all(|t| is_valid_type_annotation(t.trim()));
[INFO] [stdout] 117 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:119:5
[INFO] [stdout]     |
[INFO] [stdout] 119 |       /// 检查是否是交叉类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 120 | /     if trimmed.contains(" & ") {
[INFO] [stdout] 121 | |         return trimmed.split(" & ").all(|t| is_valid_type_annotation(t.trim()));
[INFO] [stdout] 122 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:129:5
[INFO] [stdout]     |
[INFO] [stdout] 129 |     /// 检查是否是有效的标识符（自定义类型）
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 130 |     is_valid_identifier(trimmed)
[INFO] [stdout]     |     ---------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:138:5
[INFO] [stdout]     |
[INFO] [stdout] 138 |       /// 相同类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 139 | /     if expected == actual {
[INFO] [stdout] 140 | |         return true;
[INFO] [stdout] 141 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:143:5
[INFO] [stdout]     |
[INFO] [stdout] 143 |       /// any 类型兼容所有类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 144 | /     if expected == "any" || actual == "any" {
[INFO] [stdout] 145 | |         return true;
[INFO] [stdout] 146 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:148:5
[INFO] [stdout]     |
[INFO] [stdout] 148 |       /// unknown 可以赋值给任何类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 149 | /     if actual == "unknown" {
[INFO] [stdout] 150 | |         return true;
[INFO] [stdout] 151 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:153:5
[INFO] [stdout]     |
[INFO] [stdout] 153 |       /// never 可以赋值给任何类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 154 | /     if actual == "never" {
[INFO] [stdout] 155 | |         return true;
[INFO] [stdout] 156 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:158:5
[INFO] [stdout]     |
[INFO] [stdout] 158 |       /// 检查联合类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 159 | /     if expected.contains(" | ") {
[INFO] [stdout] 160 | |         return expected.split(" | ").any(|t| types_compatible(t.trim(), actual));
[INFO] [stdout] 161 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:163:5
[INFO] [stdout]     |
[INFO] [stdout] 163 |       /// 检查数组类型
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 164 | /     if expected.ends_with("[]") && actual.ends_with("[]") {
[INFO] [stdout] 165 | |         let expected_elem = &expected[..expected.len() - 2];
[INFO] [stdout] 166 | |         let actual_elem = &actual[..actual.len() - 2];
[INFO] [stdout] 167 | |         return types_compatible(expected_elem, actual_elem);
[INFO] [stdout] 168 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:170:5
[INFO] [stdout]     |
[INFO] [stdout] 170 |       /// 数字类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 171 | /     if expected == "number" && (actual == "number" || actual.parse::<f64>().is_ok()) {
[INFO] [stdout] 172 | |         return true;
[INFO] [stdout] 173 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:175:5
[INFO] [stdout]     |
[INFO] [stdout] 175 |       /// 字符串类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 176 | /     if expected == "string" && (actual == "string" || actual.starts_with('"') || actual.starts_with('\'')) {
[INFO] [stdout] 177 | |         return true;
[INFO] [stdout] 178 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:180:5
[INFO] [stdout]     |
[INFO] [stdout] 180 |       /// 布尔类型兼容
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^
[INFO] [stdout] 181 | /     if expected == "boolean" && (actual == "boolean" || actual == "true" || actual == "false") {
[INFO] [stdout] 182 | |         return true;
[INFO] [stdout] 183 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:197:5
[INFO] [stdout]     |
[INFO] [stdout] 197 |       /// 首字符必须是字母、下划线或美元符号
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 198 | /     if !first.is_alphabetic() && first != '_' && first != '$' {
[INFO] [stdout] 199 | |         return false;
[INFO] [stdout] 200 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:202:5
[INFO] [stdout]     |
[INFO] [stdout] 202 |     /// 其余字符必须是字母、数字、下划线或美元符号
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 203 |     chars.all(|c| c.is_alphanumeric() || c == '_' || c == '$')
[INFO] [stdout]     |     ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:208:5
[INFO] [stdout]     |
[INFO] [stdout] 208 |     /// 找到匹配的右括号
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 209 |     let mut depth = 0;
[INFO] [stdout]     |     ------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:237:21
[INFO] [stdout]     |
[INFO] [stdout] 237 |                     /// 找到匹配的右括号
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 238 |                     return if comma_count == 0 && call_expr.trim() == "()" { Some(0) } else { Some(comma_count + 1) };
[INFO] [stdout]     |                     ------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:259:5
[INFO] [stdout]     |
[INFO] [stdout] 259 |       /// 查找函数签名中的参数列表
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 260 | /     if let Some(start) = type_str.find('(') {
[INFO] [stdout] 261 | |         if let Some(end) = type_str.find(')') {
[INFO] [stdout] 262 | |             let params = &type_str[start + 1..end];
[INFO] [stdout] 263 | |             let trimmed = params.trim();
[INFO] [stdout] ...   |
[INFO] [stdout] 273 | |     }
[INFO] [stdout]     | |_____- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:269:13
[INFO] [stdout]     |
[INFO] [stdout] 269 |             /// 计算逗号数量 + 1
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 270 |             let comma_count = trimmed.chars().filter(|&c| c == ',').count();
[INFO] [stdout]     |             ---------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `SymbolKind`
[INFO] [stdout]  --> src/lsp/diagnostics/mod.rs:8:27
[INFO] [stdout]   |
[INFO] [stdout] 8 | use crate::lsp::symbols::{SymbolKind, SymbolTable};
[INFO] [stdout]   |                           ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:101:9
[INFO] [stdout]     |
[INFO] [stdout] 101 |         /// 语法错误检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 102 |         diagnostics.extend(self.analyze_syntax_errors(content, change_range));
[INFO] [stdout]     |         --------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:104:9
[INFO] [stdout]     |
[INFO] [stdout] 104 |         /// 类型错误检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 105 |         diagnostics.extend(self.analyze_type_errors(content, change_range));
[INFO] [stdout]     |         ------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:107:9
[INFO] [stdout]     |
[INFO] [stdout] 107 |         /// 未使用符号检测
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 108 |         diagnostics.extend(self.analyze_unused_symbols(content, change_range));
[INFO] [stdout]     |         ---------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:117:9
[INFO] [stdout]     |
[INFO] [stdout] 117 |         /// 检查括号匹配
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 118 |         diagnostics.extend(syntax_checker::check_bracket_matching(content));
[INFO] [stdout]     |         ------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:120:9
[INFO] [stdout]     |
[INFO] [stdout] 120 |         /// 检查引号匹配
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 121 |         diagnostics.extend(syntax_checker::check_quote_matching(content));
[INFO] [stdout]     |         ----------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:123:9
[INFO] [stdout]     |
[INFO] [stdout] 123 |         /// 检查基本语法结构
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 124 |         diagnostics.extend(syntax_checker::check_basic_syntax(content));
[INFO] [stdout]     |         --------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:138:9
[INFO] [stdout]     |
[INFO] [stdout] 138 |         /// 检查变量类型一致性
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 139 |         diagnostics.extend(type_checker::check_variable_types(content, &self.symbol_table));
[INFO] [stdout]     |         ----------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:141:9
[INFO] [stdout]     |
[INFO] [stdout] 141 |         /// 检查函数调用参数
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 142 |         diagnostics.extend(type_checker::check_function_calls(content, &self.symbol_table));
[INFO] [stdout]     |         ----------------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:157:13
[INFO] [stdout]     |
[INFO] [stdout] 157 |               /// 跳过公共导出符号
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 158 | /             if symbol.is_exported {
[INFO] [stdout] 159 | |                 continue;
[INFO] [stdout] 160 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:162:13
[INFO] [stdout]     |
[INFO] [stdout] 162 |               /// 检查符号是否被使用
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 163 | /             if !self.is_symbol_used(content, &symbol.name) {
[INFO] [stdout] 164 | |                 // 如果有修改范围，只检查修改范围内的符号
[INFO] [stdout] 165 | |                 if let Some(range) = change_range {
[INFO] [stdout] 166 | |                     if symbol.range.start >= range.start && symbol.range.end <= range.end {
[INFO] [stdout] ...   |
[INFO] [stdout] 175 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:190:13
[INFO] [stdout]     |
[INFO] [stdout] 190 |               /// 简单检测：统计符号出现次数
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 191 | /             if line.contains(symbol_name) {
[INFO] [stdout] 192 | |                 let line_offset = self.get_line_offset(content, line_idx);
[INFO] [stdout] 193 | |
[INFO] [stdout] 194 | |                 /// 检查是否是声明行
[INFO] [stdout] ...   |
[INFO] [stdout] 204 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:194:17
[INFO] [stdout]     |
[INFO] [stdout] 194 |                   /// 检查是否是声明行
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 195 | /                 if !found_declaration && self.is_declaration_line(line, symbol_name) {
[INFO] [stdout] 196 | |                     found_declaration = true;
[INFO] [stdout] 197 | |                     continue;
[INFO] [stdout] 198 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:200:17
[INFO] [stdout]     |
[INFO] [stdout] 200 |                   /// 检查是否是实际使用（不是注释、字符串中）
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 201 | /                 if self.is_actual_usage(line, symbol_name) {
[INFO] [stdout] 202 | |                     usage_count += 1;
[INFO] [stdout] 203 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:231:9
[INFO] [stdout]     |
[INFO] [stdout] 231 |           /// 跳过注释行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^
[INFO] [stdout] 232 | /         if trimmed.starts_with("//") || trimmed.starts_with("/*") || trimmed.starts_with("*") {
[INFO] [stdout] 233 | |             return false;
[INFO] [stdout] 234 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:236:9
[INFO] [stdout]     |
[INFO] [stdout] 236 |           /// 跳过纯字符串行
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | /         if (trimmed.starts_with('"') || trimmed.starts_with('\'')) && (trimmed.ends_with('"') || trimmed.ends_with('\'')) {
[INFO] [stdout] 238 | |             return false;
[INFO] [stdout] 239 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:79:9
[INFO] [stdout]    |
[INFO] [stdout] 79 |         /// 参数名称提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 80 |         hints.extend(self.provide_parameter_name_hints(range_text, range.start));
[INFO] [stdout]    |         ------------------------------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:82:9
[INFO] [stdout]    |
[INFO] [stdout] 82 |         /// 类型推断提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^
[INFO] [stdout] 83 |         hints.extend(self.provide_type_inference_hints(range_text, range.start));
[INFO] [stdout]    |         ------------------------------------------------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]   --> src/lsp/inlay_hints/mod.rs:85:9
[INFO] [stdout]    |
[INFO] [stdout] 85 |         /// 枚举成员值提示
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 86 |         hints.extend(self.provide_enum_member_hints(range_text, range.start));
[INFO] [stdout]    |         --------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]    |
[INFO] [stdout]    = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:98:13
[INFO] [stdout]     |
[INFO] [stdout]  98 |               /// 查找函数调用模式
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]  99 | /             if let Some(paren_idx) = line.find('(') {
[INFO] [stdout] 100 | |                 let before_paren = &line[..paren_idx];
[INFO] [stdout] 101 | |                 let func_name = before_paren.trim().split_whitespace().last().unwrap_or("");
[INFO] [stdout] ...   |
[INFO] [stdout] 121 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:104:21
[INFO] [stdout]     |
[INFO] [stdout] 104 |                       /// 尝试从符号表获取函数参数信息
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 105 | /                     if let Some(symbol) = self.symbol_table.find_by_name(func_name) {
[INFO] [stdout] 106 | |                         if symbol.kind == SymbolKind::Function {
[INFO] [stdout] 107 | |                             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 108 | |                                 let params = self.extract_parameter_names(type_annotation);
[INFO] [stdout] ...   |
[INFO] [stdout] 119 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:134:13
[INFO] [stdout]     |
[INFO] [stdout] 134 |               /// 检测使用类型推断的变量声明（没有显式类型注解）
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 135 | /             if (line.trim().starts_with("const ") || line.trim().starts_with("let ") || line.trim().starts_with("var "))
[INFO] [stdout] 136 | |                 && !line.contains(":")
[INFO] [stdout] 137 | |             {
[INFO] [stdout] 138 | |                 /// 提取变量名
[INFO] [stdout] ...   |
[INFO] [stdout] 154 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:138:17
[INFO] [stdout]     |
[INFO] [stdout] 138 |                   /// 提取变量名
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^
[INFO] [stdout] 139 | /                 if let Some(var_name) = self.extract_variable_name(line) {
[INFO] [stdout] 140 | |                     /// 查找符号表中的类型信息
[INFO] [stdout] 141 | |                     if let Some(symbol) = self.symbol_table.find_by_name(&var_name) {
[INFO] [stdout] 142 | |                         if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] ...   |
[INFO] [stdout] 153 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:140:21
[INFO] [stdout]     |
[INFO] [stdout] 140 |                       /// 查找符号表中的类型信息
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 141 | /                     if let Some(symbol) = self.symbol_table.find_by_name(&var_name) {
[INFO] [stdout] 142 | |                         if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout] 143 | |                             /// 在变量名后添加类型提示
[INFO] [stdout] 144 | |                             if let Some(var_end) = line.find(&var_name) {
[INFO] [stdout] ...   |
[INFO] [stdout] 152 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:143:29
[INFO] [stdout]     |
[INFO] [stdout] 143 |   ...                   /// 在变量名后添加类型提示
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 144 | / ...                   if let Some(var_end) = line.find(&var_name) {
[INFO] [stdout] 145 | | ...                       let var_end_pos = var_end + var_name.len();
[INFO] [stdout] 146 | | ...                       hints.push(InlayHint::type_inference(
[INFO] [stdout] 147 | | ...                           base_offset + line_offset + var_end_pos,
[INFO] [stdout] 148 | | ...                           type_annotation.clone(),
[INFO] [stdout] 149 | | ...                       ));
[INFO] [stdout] 150 | | ...                   }
[INFO] [stdout]     | |_______________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:170:13
[INFO] [stdout]     |
[INFO] [stdout] 170 |               /// 检测枚举开始
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 171 | /             if trimmed.starts_with("enum ") {
[INFO] [stdout] 172 | |                 in_enum = true;
[INFO] [stdout] 173 | |                 enum_value = 0;
[INFO] [stdout] 174 | |                 continue;
[INFO] [stdout] 175 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:177:13
[INFO] [stdout]     |
[INFO] [stdout] 177 |               /// 检测枚举结束
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 178 | /             if in_enum && trimmed.starts_with('}') {
[INFO] [stdout] 179 | |                 in_enum = false;
[INFO] [stdout] 180 | |                 continue;
[INFO] [stdout] 181 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |               /// 在枚举内部检测成员
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 184 | /             if in_enum && !trimmed.is_empty() && !trimmed.starts_with("//") {
[INFO] [stdout] 185 | |                 /// 检查是否已经有显式值
[INFO] [stdout] 186 | |                 if !trimmed.contains('=') {
[INFO] [stdout] 187 | |                     /// 提取成员名
[INFO] [stdout] ...   |
[INFO] [stdout] 211 | |             }
[INFO] [stdout]     | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:185:17
[INFO] [stdout]     |
[INFO] [stdout] 185 |                   /// 检查是否已经有显式值
[INFO] [stdout]     |                   ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 186 | /                 if !trimmed.contains('=') {
[INFO] [stdout] 187 | |                     /// 提取成员名
[INFO] [stdout] 188 | |                     if let Some(member_name) = trimmed.split(|c: char| c == ',' || c == ' ' || c == '\t').next() {
[INFO] [stdout] 189 | |                         if !member_name.is_empty() && !member_name.starts_with("//") {
[INFO] [stdout] ...   |
[INFO] [stdout] 210 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:187:21
[INFO] [stdout]     |
[INFO] [stdout] 187 |                       /// 提取成员名
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^
[INFO] [stdout] 188 | /                     if let Some(member_name) = trimmed.split(|c: char| c == ',' || c == ' ' || c == '\t').next() {
[INFO] [stdout] 189 | |                         if !member_name.is_empty() && !member_name.starts_with("//") {
[INFO] [stdout] 190 | |                             /// 在成员名后添加值提示
[INFO] [stdout] 191 | |                             if let Some(name_end) = line.find(member_name) {
[INFO] [stdout] ...   |
[INFO] [stdout] 200 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:190:29
[INFO] [stdout]     |
[INFO] [stdout] 190 |   ...                   /// 在成员名后添加值提示
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 191 | / ...                   if let Some(name_end) = line.find(member_name) {
[INFO] [stdout] 192 | | ...                       let name_end_pos = name_end + member_name.len();
[INFO] [stdout] 193 | | ...                       hints.push(InlayHint::enum_value(
[INFO] [stdout] 194 | | ...                           base_offset + line_offset + name_end_pos,
[INFO] [stdout] ...   |
[INFO] [stdout] 197 | | ...                       enum_value += 1;
[INFO] [stdout] 198 | | ...                   }
[INFO] [stdout]     | |_______________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:203:21
[INFO] [stdout]     |
[INFO] [stdout] 203 |                       /// 如果有显式值，解析并更新 enum_value
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 204 | /                     if let Some(eq_pos) = trimmed.find('=') {
[INFO] [stdout] 205 | |                         let value_str = &trimmed[eq_pos + 1..].trim();
[INFO] [stdout] 206 | |                         if let Ok(val) = value_str.trim_matches(|c| c == ',' || c == ' ').parse::<i32>() {
[INFO] [stdout] 207 | |                             enum_value = val + 1;
[INFO] [stdout] 208 | |                         }
[INFO] [stdout] 209 | |                     }
[INFO] [stdout]     | |_____________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:221:9
[INFO] [stdout]     |
[INFO] [stdout] 221 |           /// 查找括号内的参数列表
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 222 | /         if let Some(start) = type_annotation.find('(') {
[INFO] [stdout] 223 | |             if let Some(end) = type_annotation.find(')') {
[INFO] [stdout] 224 | |                 let params_str = &type_annotation[start + 1..end];
[INFO] [stdout] ...   |
[INFO] [stdout] 242 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:226:17
[INFO] [stdout]     |
[INFO] [stdout] 226 |                   /// 分割参数
[INFO] [stdout]     |                   ^^^^^^^^^^^^
[INFO] [stdout] 227 | /                 for param in params_str.split(',') {
[INFO] [stdout] 228 | |                     let param = param.trim();
[INFO] [stdout] 229 | |                     if !param.is_empty() {
[INFO] [stdout] 230 | |                         /// 提取参数名（冒号前的部分）
[INFO] [stdout] ...   |
[INFO] [stdout] 240 | |                 }
[INFO] [stdout]     | |_________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:230:25
[INFO] [stdout]     |
[INFO] [stdout] 230 |                           /// 提取参数名（冒号前的部分）
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 231 | /                         if let Some(colon_pos) = param.find(':') {
[INFO] [stdout] 232 | |                             let param_name = param[..colon_pos].trim();
[INFO] [stdout] 233 | |                             params.push(param_name.to_string());
[INFO] [stdout] ...   |
[INFO] [stdout] 237 | |                             params.push(param.to_string());
[INFO] [stdout] 238 | |                         }
[INFO] [stdout]     | |_________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:236:29
[INFO] [stdout]     |
[INFO] [stdout] 236 | ...                   /// 没有类型注解，整个作为参数名
[INFO] [stdout]     |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 237 | ...                   params.push(param.to_string());
[INFO] [stdout]     |                       ------------------------------ rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:281:25
[INFO] [stdout]     |
[INFO] [stdout] 281 |                           /// 记录最后一个参数
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 282 | /                         if found_first {
[INFO] [stdout] 283 | |                             positions.push(paren_start + 1 + arg_start);
[INFO] [stdout] 284 | |                         }
[INFO] [stdout]     | |_________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:314:9
[INFO] [stdout]     |
[INFO] [stdout] 314 |           /// 移除 const/let/var
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 315 | /         let after_keyword = if trimmed.starts_with("const ") {
[INFO] [stdout] 316 | |             &trimmed[6..]
[INFO] [stdout] 317 | |         }
[INFO] [stdout] 318 | |         else if trimmed.starts_with("let ") {
[INFO] [stdout] ...   |
[INFO] [stdout] 325 | |             return None;
[INFO] [stdout] 326 | |         };
[INFO] [stdout]     | |__________- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:328:9
[INFO] [stdout]     |
[INFO] [stdout] 328 |         /// 提取变量名（直到空格、等号、冒号等）
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 329 |         let name: String = after_keyword.chars().take_while(|&c| c.is_alphanumeric() || c == '_' || c == '$').collect();
[INFO] [stdout]     |         ---------------------------------------------------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused import: `Scope`
[INFO] [stdout]  --> src/lsp/symbols/collector.rs:5:13
[INFO] [stdout]   |
[INFO] [stdout] 5 | use super::{Scope, ScopeType, Symbol, SymbolKind, SymbolTable};
[INFO] [stdout]   |             ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:688:9
[INFO] [stdout]     |
[INFO] [stdout] 688 |           /// 首先尝试使用符号表来查找引用
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 689 | /         if let Some(symbol_table) = self.get_symbol_table(uri) {
[INFO] [stdout] 690 | |             for symbol in symbol_table.find_all_by_name(symbol_name) {
[INFO] [stdout] 691 | |                 let location = LocationRange { uri: Arc::from(uri), range: symbol.range.clone() };
[INFO] [stdout] 692 | |                 let key = (uri, symbol.range.start, symbol.range.end);
[INFO] [stdout] ...   |
[INFO] [stdout] 697 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:699:9
[INFO] [stdout]     |
[INFO] [stdout] 699 |           /// 然后使用基于文本的查找作为补充
[INFO] [stdout]     |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 700 | /         for (line_idx, line) in content.lines().enumerate() {
[INFO] [stdout] 701 | |             let mut current_pos = 0;
[INFO] [stdout] 702 | |             while let Some(start) = line[current_pos..].find(symbol_name) {
[INFO] [stdout] 703 | |                 let actual_start = current_pos + start;
[INFO] [stdout] ...   |
[INFO] [stdout] 720 | |         }
[INFO] [stdout]     | |_________- rustdoc does not generate documentation for expressions
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:710:21
[INFO] [stdout]     |
[INFO] [stdout] 710 |                     /// 检查是否已经添加过这个引用
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 711 |                     let key = (uri, start_offset, end_offset);
[INFO] [stdout]     |                     ------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]    --> src/lsp/mod.rs:729:9
[INFO] [stdout]     |
[INFO] [stdout] 729 |         /// 检查后面是否有赋值操作符
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 730 |         let trimmed = after_symbol.trim_start();
[INFO] [stdout]     |         ---------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]     |
[INFO] [stdout]     = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1032:13
[INFO] [stdout]      |
[INFO] [stdout] 1032 |               /// 首先尝试从当前文件的符号表获取定义位置
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1033 | /             if let Some(symbol_table) = self.get_symbol_table(uri) {
[INFO] [stdout] 1034 | |                 if let Some(symbol) = symbol_table.find_by_name(&symbol_name) {
[INFO] [stdout] 1035 | |                     locations.push(LocationRange { uri: Arc::from(uri), range: symbol.range.clone() });
[INFO] [stdout] 1036 | |                     return locations;
[INFO] [stdout] 1037 | |                 }
[INFO] [stdout] 1038 | |             }
[INFO] [stdout]      | |_____________- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1040:13
[INFO] [stdout]      |
[INFO] [stdout] 1040 |             /// 跨文件查找符号定义
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1041 |             let all_uris = self.get_all_document_uris();
[INFO] [stdout]      |             -------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1055:13
[INFO] [stdout]      |
[INFO] [stdout] 1055 |             /// 回退到基于文本的查找（当前文件）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1056 |             let lines: Vec<&str> = content.lines().collect();
[INFO] [stdout]      |             ------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1090:13
[INFO] [stdout]      |
[INFO] [stdout] 1090 |             /// 1. 先在当前文件中查找引用
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1091 |             references.extend(self.find_references_in_file(uri, &content, &symbol_name));
[INFO] [stdout]      |             ---------------------------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1093:13
[INFO] [stdout]      |
[INFO] [stdout] 1093 |             /// 2. 然后在所有其他文件中查找引用（并行处理）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1094 |             let all_uris = self.get_all_document_uris();
[INFO] [stdout]      |             -------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1293:13
[INFO] [stdout]      |
[INFO] [stdout] 1293 |             /// 获取符号表用于语义高亮
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1294 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |             ------------------------------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1296:13
[INFO] [stdout]      |
[INFO] [stdout] 1296 | /             /// 使用 highlighter 模块进行语法高亮
[INFO] [stdout] 1297 | |             /// 这里我们返回一个空的实现
[INFO] [stdout]      | |________________________________________^
[INFO] [stdout] 1298 |               Some(SemanticTokens { data: Vec::new(), result_id: None })
[INFO] [stdout]      |               ---------------------------------------------------------- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1313:13
[INFO] [stdout]      |
[INFO] [stdout] 1313 |             /// 获取或创建符号表
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1314 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |             ------------------------------------------------------------------ rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1316:13
[INFO] [stdout]      |
[INFO] [stdout] 1316 |             /// 创建内联提示提供者
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1317 |             let provider = InlayHintProvider::new(symbol_table);
[INFO] [stdout]      |             ---------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1319:13
[INFO] [stdout]      |
[INFO] [stdout] 1319 |             /// 提供内联提示
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^
[INFO] [stdout] 1320 |             let hints = provider.provide_hints(&content, range);
[INFO] [stdout]      |             ---------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1322:13
[INFO] [stdout]      |
[INFO] [stdout] 1322 |               /// 转换为 LSP InlayHint 格式
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1323 | /             hints
[INFO] [stdout] 1324 | |                 .into_iter()
[INFO] [stdout] 1325 | |                 .map(|hint| {
[INFO] [stdout] 1326 | |                     let position = self.offset_to_position(&content, hint.position);
[INFO] [stdout] ...    |
[INFO] [stdout] 1338 | |                 })
[INFO] [stdout] 1339 | |                 .collect()
[INFO] [stdout]      | |__________________________- rustdoc does not generate documentation for expressions
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1398:13
[INFO] [stdout]      |
[INFO] [stdout] 1398 |               /// 获取或更新符号表
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1399 | /             let symbol_table = self.get_symbol_table(uri).unwrap_or_else(|| {
[INFO] [stdout] 1400 | |                 self.update_symbol_table(uri, &content);
[INFO] [stdout] 1401 | |                 self.get_symbol_table(uri).unwrap_or_default()
[INFO] [stdout] 1402 | |             });
[INFO] [stdout]      | |_______________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1404:13
[INFO] [stdout]      |
[INFO] [stdout] 1404 |               /// 获取修改范围
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^
[INFO] [stdout] 1405 | /             let change_range = {
[INFO] [stdout] 1406 | |                 let changes = self.document_changes.read().unwrap();
[INFO] [stdout] 1407 | |                 changes.get(uri).cloned().unwrap_or(None)
[INFO] [stdout] 1408 | |             };
[INFO] [stdout]      | |______________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1410:13
[INFO] [stdout]      |
[INFO] [stdout] 1410 |             /// 创建诊断分析器
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1411 |             let analyzer = DiagnosticAnalyzer::new(symbol_table);
[INFO] [stdout]      |             ----------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1413:13
[INFO] [stdout]      |
[INFO] [stdout] 1413 |             /// 分析诊断（使用增量诊断）
[INFO] [stdout]      |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1414 |             let diagnostics = analyzer.analyze_with_range(&content, change_range);
[INFO] [stdout]      |             ---------------------------------------------------------------------- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused doc comment
[INFO] [stdout]     --> src/lsp/mod.rs:1416:13
[INFO] [stdout]      |
[INFO] [stdout] 1416 |               /// 转换为 LSP Diagnostic 格式
[INFO] [stdout]      |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 1417 | /             let result: Vec<Diagnostic> = diagnostics
[INFO] [stdout] 1418 | |                 .into_iter()
[INFO] [stdout] 1419 | |                 .map(|d| {
[INFO] [stdout] 1420 | |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout] ...    |
[INFO] [stdout] 1435 | |                 })
[INFO] [stdout] 1436 | |                 .collect();
[INFO] [stdout]      | |___________________________- rustdoc does not generate documentation for statements
[INFO] [stdout]      |
[INFO] [stdout]      = help: use `//` for a plain comment
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: the feature `new_range_api` has been stable since 1.96.0 and no longer requires an attribute to enable
[INFO] [stdout]  --> src/lib.rs:1:12
[INFO] [stdout]   |
[INFO] [stdout] 1 | #![feature(new_range_api)]
[INFO] [stdout]   |            ^^^^^^^^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `#[warn(stable_features)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:555:17
[INFO] [stdout]     |
[INFO] [stdout] 555 |             let mut chars = trimmed.chars();
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `type_annotation`
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:24:25
[INFO] [stdout]    |
[INFO] [stdout] 24 |             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout]    |                         ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_type_annotation`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:308:17
[INFO] [stdout]     |
[INFO] [stdout] 308 |             let mut chars = trimmed.chars();
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `declaration_pattern`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let declaration_pattern =
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_declaration_pattern`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `line_offset`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:192:21
[INFO] [stdout]     |
[INFO] [stdout] 192 |                 let line_offset = self.get_line_offset(content, line_idx);
[INFO] [stdout]     |                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_line_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `symbol_name`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:228:43
[INFO] [stdout]     |
[INFO] [stdout] 228 |     fn is_actual_usage(&self, line: &str, symbol_name: &str) -> bool {
[INFO] [stdout]     |                                           ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_symbol_name`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:555:17
[INFO] [stdout]     |
[INFO] [stdout] 555 |             let mut chars = trimmed.chars();
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_mut)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `type_annotation`
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:24:25
[INFO] [stdout]    |
[INFO] [stdout] 24 |             if let Some(ref type_annotation) = symbol.type_annotation {
[INFO] [stdout]    |                         ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_type_annotation`
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:161:13
[INFO] [stdout]     |
[INFO] [stdout] 161 |         let mut in_interface = false;
[INFO] [stdout]     |             ----^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable `arrow_param_count` is assigned to, but never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:155:13
[INFO] [stdout]     |
[INFO] [stdout] 155 |         let mut arrow_param_count = 0;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: consider using `_arrow_param_count` instead
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `in_interface`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:161:13
[INFO] [stdout]     |
[INFO] [stdout] 161 |         let mut in_interface = false;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_in_interface`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable `in_decorator` is assigned to, but never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:162:13
[INFO] [stdout]     |
[INFO] [stdout] 162 |         let mut in_decorator = false;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: consider using `_in_decorator` instead
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `arrow_param_count` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:466:25
[INFO] [stdout]     |
[INFO] [stdout] 466 |                         arrow_param_count += 1;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout]     = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `in_decorator` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:231:21
[INFO] [stdout]     |
[INFO] [stdout] 231 |                     in_decorator = false;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^ this value is reassigned later and never used
[INFO] [stdout] ...
[INFO] [stdout] 245 |                     in_decorator = true;
[INFO] [stdout]     |                     ------------------- `in_decorator` is overwritten here before the previous value is read
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `in_decorator` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:245:21
[INFO] [stdout]     |
[INFO] [stdout] 245 |                     in_decorator = true;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `param_count` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:393:51
[INFO] [stdout]     |
[INFO] [stdout] 393 | ...                   let mut param_count = 0;
[INFO] [stdout]     |                                             ^ this value is reassigned later and never used
[INFO] [stdout] ...
[INFO] [stdout] 418 | ...                       param_count = params_trimmed.split(',').filter(|p| !p.trim().is_empty()).count();
[INFO] [stdout]     |                           -------------------------------------------------------------------------------- `param_count` is overwritten here before the previous value is read
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:308:17
[INFO] [stdout]     |
[INFO] [stdout] 308 |             let mut chars = trimmed.chars();
[INFO] [stdout]     |                 ----^^^^^
[INFO] [stdout]     |                 |
[INFO] [stdout]     |                 help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:675:25
[INFO] [stdout]     |
[INFO] [stdout] 675 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:707:25
[INFO] [stdout]     |
[INFO] [stdout] 707 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:739:25
[INFO] [stdout]     |
[INFO] [stdout] 739 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:675:25
[INFO] [stdout]     |
[INFO] [stdout] 675 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:707:25
[INFO] [stdout]     |
[INFO] [stdout] 707 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:739:25
[INFO] [stdout]     |
[INFO] [stdout] 739 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `declaration_pattern`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:183:13
[INFO] [stdout]     |
[INFO] [stdout] 183 |         let declaration_pattern =
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_declaration_pattern`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `line_offset`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:192:21
[INFO] [stdout]     |
[INFO] [stdout] 192 |                 let line_offset = self.get_line_offset(content, line_idx);
[INFO] [stdout]     |                     ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_line_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `symbol_name`
[INFO] [stdout]    --> src/lsp/diagnostics/mod.rs:228:43
[INFO] [stdout]     |
[INFO] [stdout] 228 |     fn is_actual_usage(&self, line: &str, symbol_name: &str) -> bool {
[INFO] [stdout]     |                                           ^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_symbol_name`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i`
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:111:38
[INFO] [stdout]     |
[INFO] [stdout] 111 | ...                   for (i, (arg_pos, param_name)) in arg_positions.iter().zip(params.iter()).enumerate() {
[INFO] [stdout]     |                            ^ help: if this is intentional, prefix it with an underscore: `_i`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `range`
[INFO] [stdout]   --> src/lsp/symbols/collector.rs:39:57
[INFO] [stdout]    |
[INFO] [stdout] 39 |     pub fn collect_incremental(&mut self, source: &str, range: core::range::Range<usize>) -> &SymbolTable {
[INFO] [stdout]    |                                                         ^^^^^ help: if this is intentional, prefix it with an underscore: `_range`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `line_idx`
[INFO] [stdout]   --> src/lsp/symbols/collector.rs:50:14
[INFO] [stdout]    |
[INFO] [stdout] 50 |         for (line_idx, line) in lines.iter().enumerate() {
[INFO] [stdout]    |              ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_line_idx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:153:94
[INFO] [stdout]     |
[INFO] [stdout] 153 |     fn parse_function_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                              ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:230:91
[INFO] [stdout]     |
[INFO] [stdout] 230 |     fn parse_class_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                           ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:272:95
[INFO] [stdout]     |
[INFO] [stdout] 272 |     fn parse_interface_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                               ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:340:90
[INFO] [stdout]     |
[INFO] [stdout] 340 |     fn parse_enum_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                          ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:161:13
[INFO] [stdout]     |
[INFO] [stdout] 161 |         let mut in_interface = false;
[INFO] [stdout]     |             ----^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable `arrow_param_count` is assigned to, but never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:155:13
[INFO] [stdout]     |
[INFO] [stdout] 155 |         let mut arrow_param_count = 0;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: consider using `_arrow_param_count` instead
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `in_interface`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:161:13
[INFO] [stdout]     |
[INFO] [stdout] 161 |         let mut in_interface = false;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_in_interface`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable `in_decorator` is assigned to, but never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:162:13
[INFO] [stdout]     |
[INFO] [stdout] 162 |         let mut in_decorator = false;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: consider using `_in_decorator` instead
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `arrow_param_count` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:466:25
[INFO] [stdout]     |
[INFO] [stdout] 466 |                         arrow_param_count += 1;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout]     = note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `in_decorator` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:231:21
[INFO] [stdout]     |
[INFO] [stdout] 231 |                     in_decorator = false;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^^ this value is reassigned later and never used
[INFO] [stdout] ...
[INFO] [stdout] 245 |                     in_decorator = true;
[INFO] [stdout]     |                     ------------------- `in_decorator` is overwritten here before the previous value is read
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `in_decorator` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:245:21
[INFO] [stdout]     |
[INFO] [stdout] 245 |                     in_decorator = true;
[INFO] [stdout]     |                     ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = help: maybe it is overwritten before being read?
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: value assigned to `param_count` is never read
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:393:51
[INFO] [stdout]     |
[INFO] [stdout] 393 | ...                   let mut param_count = 0;
[INFO] [stdout]     |                                             ^ this value is reassigned later and never used
[INFO] [stdout] ...
[INFO] [stdout] 418 | ...                       param_count = params_trimmed.split(',').filter(|p| !p.trim().is_empty()).count();
[INFO] [stdout]     |                           -------------------------------------------------------------------------------- `param_count` is overwritten here before the previous value is read
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:675:25
[INFO] [stdout]     |
[INFO] [stdout] 675 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:707:25
[INFO] [stdout]     |
[INFO] [stdout] 707 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:739:25
[INFO] [stdout]     |
[INFO] [stdout] 739 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ----^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:675:25
[INFO] [stdout]     |
[INFO] [stdout] 675 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:707:25
[INFO] [stdout]     |
[INFO] [stdout] 707 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `seen_non_whitespace`
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:739:25
[INFO] [stdout]     |
[INFO] [stdout] 739 |                     let mut seen_non_whitespace = false;
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_seen_non_whitespace`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i`
[INFO] [stdout]    --> src/lsp/inlay_hints/mod.rs:111:38
[INFO] [stdout]     |
[INFO] [stdout] 111 | ...                   for (i, (arg_pos, param_name)) in arg_positions.iter().zip(params.iter()).enumerate() {
[INFO] [stdout]     |                            ^ help: if this is intentional, prefix it with an underscore: `_i`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `range`
[INFO] [stdout]   --> src/lsp/symbols/collector.rs:39:57
[INFO] [stdout]    |
[INFO] [stdout] 39 |     pub fn collect_incremental(&mut self, source: &str, range: core::range::Range<usize>) -> &SymbolTable {
[INFO] [stdout]    |                                                         ^^^^^ help: if this is intentional, prefix it with an underscore: `_range`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `line_idx`
[INFO] [stdout]   --> src/lsp/symbols/collector.rs:50:14
[INFO] [stdout]    |
[INFO] [stdout] 50 |         for (line_idx, line) in lines.iter().enumerate() {
[INFO] [stdout]    |              ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_line_idx`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:153:94
[INFO] [stdout]     |
[INFO] [stdout] 153 |     fn parse_function_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                              ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:230:91
[INFO] [stdout]     |
[INFO] [stdout] 230 |     fn parse_class_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                           ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/mod.rs:518:13
[INFO] [stdout]     |
[INFO] [stdout] 518 |         let mut current_offset = line_start;
[INFO] [stdout]     |             ----^^^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `current_offset`
[INFO] [stdout]    --> src/lsp/mod.rs:518:13
[INFO] [stdout]     |
[INFO] [stdout] 518 |         let mut current_offset = line_start;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_current_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `c`
[INFO] [stdout]    --> src/lsp/mod.rs:521:17
[INFO] [stdout]     |
[INFO] [stdout] 521 |         for (i, c) in text[line_start..].char_indices() {
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_c`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:272:95
[INFO] [stdout]     |
[INFO] [stdout] 272 |     fn parse_interface_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                               ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i`
[INFO] [stdout]    --> src/lsp/mod.rs:543:14
[INFO] [stdout]     |
[INFO] [stdout] 543 |         for (i, c) in text[line_start..offset].char_indices() {
[INFO] [stdout]     |              ^ help: if this is intentional, prefix it with an underscore: `_i`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `c`
[INFO] [stdout]    --> src/lsp/mod.rs:543:17
[INFO] [stdout]     |
[INFO] [stdout] 543 |         for (i, c) in text[line_start..offset].char_indices() {
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_c`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tab_size`
[INFO] [stdout]    --> src/lsp/mod.rs:572:40
[INFO] [stdout]     |
[INFO] [stdout] 572 |     pub fn parse_format_options(&self, tab_size: u32, insert_spaces: bool) -> FormatOptions {
[INFO] [stdout]     |                                        ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_tab_size`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `insert_spaces`
[INFO] [stdout]    --> src/lsp/mod.rs:572:55
[INFO] [stdout]     |
[INFO] [stdout] 572 |     pub fn parse_format_options(&self, tab_size: u32, insert_spaces: bool) -> FormatOptions {
[INFO] [stdout]     |                                                       ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_insert_spaces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:622:33
[INFO] [stdout]     |
[INFO] [stdout] 622 |     fn infer_object_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                 ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:629:32
[INFO] [stdout]     |
[INFO] [stdout] 629 |     fn infer_array_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:636:35
[INFO] [stdout]     |
[INFO] [stdout] 636 |     fn infer_function_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                   ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `source`
[INFO] [stdout]    --> src/lsp/symbols/collector.rs:340:90
[INFO] [stdout]     |
[INFO] [stdout] 340 |     fn parse_enum_declaration(&mut self, line: &str, line_start: usize, line_end: usize, source: &str) {
[INFO] [stdout]     |                                                                                          ^^^^^^ help: if this is intentional, prefix it with an underscore: `_source`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `content`
[INFO] [stdout]     --> src/lsp/mod.rs:1291:17
[INFO] [stdout]      |
[INFO] [stdout] 1291 |             let content = self.get_document(uri).or_else(|| self.get_file_content(uri))?;
[INFO] [stdout]      |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_content`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `symbol_table`
[INFO] [stdout]     --> src/lsp/mod.rs:1294:17
[INFO] [stdout]      |
[INFO] [stdout] 1294 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |                 ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_symbol_table`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `start_line`
[INFO] [stdout]     --> src/lsp/mod.rs:1420:26
[INFO] [stdout]      |
[INFO] [stdout] 1420 |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout]      |                          ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_start_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `start_col`
[INFO] [stdout]     --> src/lsp/mod.rs:1420:38
[INFO] [stdout]      |
[INFO] [stdout] 1420 |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout]      |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_start_col`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `end_line`
[INFO] [stdout]     --> src/lsp/mod.rs:1421:26
[INFO] [stdout]      |
[INFO] [stdout] 1421 |                     let (end_line, end_col) = self.get_line_and_column(&content, d.range.end);
[INFO] [stdout]      |                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_end_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `end_col`
[INFO] [stdout]     --> src/lsp/mod.rs:1421:36
[INFO] [stdout]      |
[INFO] [stdout] 1421 |                     let (end_line, end_col) = self.get_line_and_column(&content, d.range.end);
[INFO] [stdout]      |                                    ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_end_col`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `content_hash`
[INFO] [stdout]     --> src/lsp/mod.rs:1388:17
[INFO] [stdout]      |
[INFO] [stdout] 1388 |             let content_hash = self.calculate_hash(&content);
[INFO] [stdout]      |                 ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_content_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `completion_sorter` and `completion_usage` are never read
[INFO] [stdout]   --> src/lsp/mod.rs:46:5
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub struct TypeScriptLanguageService {
[INFO] [stdout]    |            ------------------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 46 |     completion_sorter: Mutex<completion::CompletionSorter>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 47 |     /// 补全使用频率
[INFO] [stdout] 48 |     completion_usage: Mutex<HashMap<String, u32>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/lsp/mod.rs:82:8
[INFO] [stdout]     |
[INFO] [stdout]  57 | impl TypeScriptLanguageService {
[INFO] [stdout]     | ------------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  82 |     fn set_document(&self, uri: String, content: String) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  97 |     fn clear_caches(&self, uri: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     fn set_document_with_change(&self, uri: String, content: String, change_range: Range<usize>) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 253 |     fn is_object_literal_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 270 |     fn is_type_annotation_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 288 |     fn is_function_parameter_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 325 |     fn is_in_string_or_comment(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 643 |     fn update_completion_usage(&self, item: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 726 |     fn is_write_reference(&self, line: &str, symbol_start: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 741 |     fn calculate_relevance(&self, item: &CompletionItem, prefix: &str) -> f64 {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 779 |     fn fuzzy_match(&self, label: &str, prefix: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 797 |     fn sort_completions(&self, completions: &mut Vec<CompletionItem>, prefix: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ContextDetector` is never constructed
[INFO] [stdout]   --> src/lsp/completion/context.rs:37:12
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct ContextDetector;
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated functions are never used
[INFO] [stdout]    --> src/lsp/completion/context.rs:41:12
[INFO] [stdout]     |
[INFO] [stdout]  39 | impl ContextDetector {
[INFO] [stdout]     | -------------------- associated functions in this implementation
[INFO] [stdout]  40 |     /// 检测补全上下文
[INFO] [stdout]  41 |     pub fn detect(text: &str, offset: usize) -> CompletionContext {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  66 |     fn is_member_access_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  77 |     fn is_object_literal_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  94 |     fn is_type_annotation_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     fn is_function_parameter_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     fn is_in_string_or_comment(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |     fn parse_member_access(text: &str, offset: usize) -> Option<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 227 |     fn extract_identifier_before(text: &str) -> Option<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 259 |     fn extract_prefix(text: &str, offset: usize) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `is_open` is never read
[INFO] [stdout]   --> src/lsp/diagnostics/syntax_checker.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 31 | struct BracketInfo {
[INFO] [stdout]    |        ----------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 35 |     is_open: bool,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `BracketInfo` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `types_compatible` is never used
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:134:4
[INFO] [stdout]     |
[INFO] [stdout] 134 | fn types_compatible(expected: &str, actual: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variable does not need to be mutable
[INFO] [stdout]    --> src/lsp/mod.rs:518:13
[INFO] [stdout]     |
[INFO] [stdout] 518 |         let mut current_offset = line_start;
[INFO] [stdout]     |             ----^^^^^^^^^^^^^^
[INFO] [stdout]     |             |
[INFO] [stdout]     |             help: remove this `mut`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `normalize_quotes`, `handle_trailing_comma`, `remove_trailing_commas`, and `add_trailing_commas` are never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:523:8
[INFO] [stdout]     |
[INFO] [stdout] 114 | impl Formatter {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 523 |     fn normalize_quotes(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 599 |     fn handle_trailing_comma(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 607 |     fn remove_trailing_commas(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 644 |     fn add_trailing_commas(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a module
[INFO] [stdout]   --> src/lsp/mod.rs:25:1
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub mod formatter;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout] note: the lint level is defined here
[INFO] [stdout]   --> src/lib.rs:2:9
[INFO] [stdout]    |
[INFO] [stdout]  2 | #![warn(missing_docs)]
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `current_offset`
[INFO] [stdout]    --> src/lsp/mod.rs:518:13
[INFO] [stdout]     |
[INFO] [stdout] 518 |         let mut current_offset = line_start;
[INFO] [stdout]     |             ^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_current_offset`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `c`
[INFO] [stdout]    --> src/lsp/mod.rs:521:17
[INFO] [stdout]     |
[INFO] [stdout] 521 |         for (i, c) in text[line_start..].char_indices() {
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_c`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]   --> src/lsp/mod.rs:76:21
[INFO] [stdout]    |
[INFO] [stdout] 76 |     fn get_document(&self, uri: &str) -> Option<Cow<str>> {
[INFO] [stdout]    |                     ^^^^^                       ^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]    |                     |
[INFO] [stdout]    |                     the lifetime is elided here
[INFO] [stdout]    |
[INFO] [stdout]    = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]    = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]    |
[INFO] [stdout] 76 |     fn get_document(&self, uri: &str) -> Option<Cow<'_, str>> {
[INFO] [stdout]    |                                                     +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: comparison is useless due to type limits
[INFO] [stdout]    --> src/lsp/mod.rs:369:27
[INFO] [stdout]     |
[INFO] [stdout] 369 |                     while j >= 0 {
[INFO] [stdout]     |                           ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_comparisons)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `i`
[INFO] [stdout]    --> src/lsp/mod.rs:543:14
[INFO] [stdout]     |
[INFO] [stdout] 543 |         for (i, c) in text[line_start..offset].char_indices() {
[INFO] [stdout]     |              ^ help: if this is intentional, prefix it with an underscore: `_i`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/lsp/mod.rs:466:25
[INFO] [stdout]     |
[INFO] [stdout] 466 |     fn get_file_content(&self, uri: &str) -> Option<Cow<str>> {
[INFO] [stdout]     |                         ^^^^^                       ^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         the lifetime is elided here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 466 |     fn get_file_content(&self, uri: &str) -> Option<Cow<'_, str>> {
[INFO] [stdout]     |                                                         +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `c`
[INFO] [stdout]    --> src/lsp/mod.rs:543:17
[INFO] [stdout]     |
[INFO] [stdout] 543 |         for (i, c) in text[line_start..offset].char_indices() {
[INFO] [stdout]     |                 ^ help: if this is intentional, prefix it with an underscore: `_c`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `tab_size`
[INFO] [stdout]    --> src/lsp/mod.rs:572:40
[INFO] [stdout]     |
[INFO] [stdout] 572 |     pub fn parse_format_options(&self, tab_size: u32, insert_spaces: bool) -> FormatOptions {
[INFO] [stdout]     |                                        ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_tab_size`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `insert_spaces`
[INFO] [stdout]    --> src/lsp/mod.rs:572:55
[INFO] [stdout]     |
[INFO] [stdout] 572 |     pub fn parse_format_options(&self, tab_size: u32, insert_spaces: bool) -> FormatOptions {
[INFO] [stdout]     |                                                       ^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_insert_spaces`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     pub context_type: CompletionContextType,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:622:33
[INFO] [stdout]     |
[INFO] [stdout] 622 |     fn infer_object_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                 ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:629:32
[INFO] [stdout]     |
[INFO] [stdout] 629 |     fn infer_array_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `expr`
[INFO] [stdout]    --> src/lsp/mod.rs:636:35
[INFO] [stdout]     |
[INFO] [stdout] 636 |     fn infer_function_type(&self, expr: &str) -> String {
[INFO] [stdout]     |                                   ^^^^ help: if this is intentional, prefix it with an underscore: `_expr`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:25:5
[INFO] [stdout]    |
[INFO] [stdout] 25 |     pub prefix: String,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 26 |     pub object_name: Option<String>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: comparison is useless due to type limits
[INFO] [stdout]    --> src/lsp/completion/context.rs:192:27
[INFO] [stdout]     |
[INFO] [stdout] 192 |                     while j >= 0 {
[INFO] [stdout]     |                           ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `content`
[INFO] [stdout]     --> src/lsp/mod.rs:1291:17
[INFO] [stdout]      |
[INFO] [stdout] 1291 |             let content = self.get_document(uri).or_else(|| self.get_file_content(uri))?;
[INFO] [stdout]      |                 ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_content`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `symbol_table`
[INFO] [stdout]     --> src/lsp/mod.rs:1294:17
[INFO] [stdout]      |
[INFO] [stdout] 1294 |             let symbol_table = self.get_symbol_table(uri).unwrap_or_default();
[INFO] [stdout]      |                 ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_symbol_table`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `start_line`
[INFO] [stdout]     --> src/lsp/mod.rs:1420:26
[INFO] [stdout]      |
[INFO] [stdout] 1420 |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout]      |                          ^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_start_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `start_col`
[INFO] [stdout]     --> src/lsp/mod.rs:1420:38
[INFO] [stdout]      |
[INFO] [stdout] 1420 |                     let (start_line, start_col) = self.get_line_and_column(&content, d.range.start);
[INFO] [stdout]      |                                      ^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_start_col`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `end_line`
[INFO] [stdout]     --> src/lsp/mod.rs:1421:26
[INFO] [stdout]      |
[INFO] [stdout] 1421 |                     let (end_line, end_col) = self.get_line_and_column(&content, d.range.end);
[INFO] [stdout]      |                          ^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_end_line`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `end_col`
[INFO] [stdout]     --> src/lsp/mod.rs:1421:36
[INFO] [stdout]      |
[INFO] [stdout] 1421 |                     let (end_line, end_col) = self.get_line_and_column(&content, d.range.end);
[INFO] [stdout]      |                                    ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_end_col`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unused variable: `content_hash`
[INFO] [stdout]     --> src/lsp/mod.rs:1388:17
[INFO] [stdout]      |
[INFO] [stdout] 1388 |             let content_hash = self.calculate_hash(&content);
[INFO] [stdout]      |                 ^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_content_hash`
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `completion_sorter` and `completion_usage` are never read
[INFO] [stdout]   --> src/lsp/mod.rs:46:5
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub struct TypeScriptLanguageService {
[INFO] [stdout]    |            ------------------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 46 |     completion_sorter: Mutex<completion::CompletionSorter>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 47 |     /// 补全使用频率
[INFO] [stdout] 48 |     completion_usage: Mutex<HashMap<String, u32>>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple methods are never used
[INFO] [stdout]    --> src/lsp/mod.rs:82:8
[INFO] [stdout]     |
[INFO] [stdout]  57 | impl TypeScriptLanguageService {
[INFO] [stdout]     | ------------------------------ methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  82 |     fn set_document(&self, uri: String, content: String) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  97 |     fn clear_caches(&self, uri: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     fn set_document_with_change(&self, uri: String, content: String, change_range: Range<usize>) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 253 |     fn is_object_literal_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 270 |     fn is_type_annotation_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 288 |     fn is_function_parameter_context(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 325 |     fn is_in_string_or_comment(&self, text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 643 |     fn update_completion_usage(&self, item: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 726 |     fn is_write_reference(&self, line: &str, symbol_start: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 741 |     fn calculate_relevance(&self, item: &CompletionItem, prefix: &str) -> f64 {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 779 |     fn fuzzy_match(&self, label: &str, prefix: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 797 |     fn sort_completions(&self, completions: &mut Vec<CompletionItem>, prefix: &str) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ContextDetector` is never constructed
[INFO] [stdout]   --> src/lsp/completion/context.rs:37:12
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct ContextDetector;
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated functions are never used
[INFO] [stdout]    --> src/lsp/completion/context.rs:41:12
[INFO] [stdout]     |
[INFO] [stdout]  39 | impl ContextDetector {
[INFO] [stdout]     | -------------------- associated functions in this implementation
[INFO] [stdout]  40 |     /// 检测补全上下文
[INFO] [stdout]  41 |     pub fn detect(text: &str, offset: usize) -> CompletionContext {
[INFO] [stdout]     |            ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  66 |     fn is_member_access_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  77 |     fn is_object_literal_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  94 |     fn is_type_annotation_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     fn is_function_parameter_context(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     fn is_in_string_or_comment(text: &str, offset: usize) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 214 |     fn parse_member_access(text: &str, offset: usize) -> Option<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 227 |     fn extract_identifier_before(text: &str) -> Option<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 259 |     fn extract_prefix(text: &str, offset: usize) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `is_open` is never read
[INFO] [stdout]   --> src/lsp/diagnostics/syntax_checker.rs:35:5
[INFO] [stdout]    |
[INFO] [stdout] 31 | struct BracketInfo {
[INFO] [stdout]    |        ----------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 35 |     is_open: bool,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `BracketInfo` has derived impls for the traits `Debug` and `Clone`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `types_compatible` is never used
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:134:4
[INFO] [stdout]     |
[INFO] [stdout] 134 | fn types_compatible(expected: &str, actual: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `normalize_quotes`, `handle_trailing_comma`, `remove_trailing_commas`, and `add_trailing_commas` are never used
[INFO] [stdout]    --> src/lsp/formatter/mod.rs:523:8
[INFO] [stdout]     |
[INFO] [stdout] 114 | impl Formatter {
[INFO] [stdout]     | -------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 523 |     fn normalize_quotes(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 599 |     fn handle_trailing_comma(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 607 |     fn remove_trailing_commas(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 644 |     fn add_trailing_commas(&self, text: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a module
[INFO] [stdout]   --> src/lsp/mod.rs:25:1
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub mod formatter;
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout] note: the lint level is defined here
[INFO] [stdout]   --> src/lib.rs:2:9
[INFO] [stdout]    |
[INFO] [stdout]  2 | #![warn(missing_docs)]
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]   --> src/lsp/mod.rs:76:21
[INFO] [stdout]    |
[INFO] [stdout] 76 |     fn get_document(&self, uri: &str) -> Option<Cow<str>> {
[INFO] [stdout]    |                     ^^^^^                       ^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]    |                     |
[INFO] [stdout]    |                     the lifetime is elided here
[INFO] [stdout]    |
[INFO] [stdout]    = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout]    = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]    |
[INFO] [stdout] 76 |     fn get_document(&self, uri: &str) -> Option<Cow<'_, str>> {
[INFO] [stdout]    |                                                     +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: comparison is useless due to type limits
[INFO] [stdout]    --> src/lsp/mod.rs:369:27
[INFO] [stdout]     |
[INFO] [stdout] 369 |                     while j >= 0 {
[INFO] [stdout]     |                           ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(unused_comparisons)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: hiding a lifetime that's elided elsewhere is confusing
[INFO] [stdout]    --> src/lsp/mod.rs:466:25
[INFO] [stdout]     |
[INFO] [stdout] 466 |     fn get_file_content(&self, uri: &str) -> Option<Cow<str>> {
[INFO] [stdout]     |                         ^^^^^                       ^^^^^^^^ the same lifetime is hidden here
[INFO] [stdout]     |                         |
[INFO] [stdout]     |                         the lifetime is elided here
[INFO] [stdout]     |
[INFO] [stdout]     = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
[INFO] [stdout] help: use `'_` for type paths
[INFO] [stdout]     |
[INFO] [stdout] 466 |     fn get_file_content(&self, uri: &str) -> Option<Cow<'_, str>> {
[INFO] [stdout]     |                                                         +++
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:24:5
[INFO] [stdout]    |
[INFO] [stdout] 24 |     pub context_type: CompletionContextType,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:25:5
[INFO] [stdout]    |
[INFO] [stdout] 25 |     pub prefix: String,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: missing documentation for a struct field
[INFO] [stdout]   --> src/lsp/completion/context.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 26 |     pub object_name: Option<String>,
[INFO] [stdout]    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: comparison is useless due to type limits
[INFO] [stdout]    --> src/lsp/completion/context.rs:192:27
[INFO] [stdout]     |
[INFO] [stdout] 192 |                     while j >= 0 {
[INFO] [stdout]     |                           ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `extract_argument_count` is private
[INFO] [stdout]    --> tests/test_type_checker.rs:2:5
[INFO] [stdout]     |
[INFO] [stdout]   2 |     extract_argument_count, extract_param_count, is_nested_scope, is_valid_identifier, is_valid_type_annotation,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `extract_argument_count` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:207:1
[INFO] [stdout]     |
[INFO] [stdout] 207 | fn extract_argument_count(call_expr: &str) -> Option<usize> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `extract_param_count` is private
[INFO] [stdout]    --> tests/test_type_checker.rs:2:29
[INFO] [stdout]     |
[INFO] [stdout]   2 |     extract_argument_count, extract_param_count, is_nested_scope, is_valid_identifier, is_valid_type_annotation,
[INFO] [stdout]     |                             ^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `extract_param_count` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:256:1
[INFO] [stdout]     |
[INFO] [stdout] 256 | fn extract_param_count(type_annotation: &Option<String>) -> Option<usize> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `is_nested_scope` is private
[INFO] [stdout]    --> tests/test_type_checker.rs:2:50
[INFO] [stdout]     |
[INFO] [stdout]   2 |     extract_argument_count, extract_param_count, is_nested_scope, is_valid_identifier, is_valid_type_annotation,
[INFO] [stdout]     |                                                  ^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `is_nested_scope` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:371:1
[INFO] [stdout]     |
[INFO] [stdout] 371 | fn is_nested_scope(new_pos: usize, outer_start: usize, outer_end: usize) -> bool {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `is_valid_identifier` is private
[INFO] [stdout]    --> tests/test_type_checker.rs:2:67
[INFO] [stdout]     |
[INFO] [stdout]   2 |     extract_argument_count, extract_param_count, is_nested_scope, is_valid_identifier, is_valid_type_annotation,
[INFO] [stdout]     |                                                                   ^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `is_valid_identifier` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:189:1
[INFO] [stdout]     |
[INFO] [stdout] 189 | fn is_valid_identifier(s: &str) -> bool {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `is_valid_type_annotation` is private
[INFO] [stdout]   --> tests/test_type_checker.rs:2:88
[INFO] [stdout]    |
[INFO] [stdout]  2 |     extract_argument_count, extract_param_count, is_nested_scope, is_valid_identifier, is_valid_type_annotation,
[INFO] [stdout]    |                                                                                        ^^^^^^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]    |
[INFO] [stdout] note: the function `is_valid_type_annotation` is defined here
[INFO] [stdout]   --> src/lsp/diagnostics/type_checker.rs:83:1
[INFO] [stdout]    |
[INFO] [stdout] 83 | fn is_valid_type_annotation(type_annotation: &str) -> bool {
[INFO] [stdout]    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `types_compatible` is private
[INFO] [stdout]    --> tests/test_type_checker.rs:3:5
[INFO] [stdout]     |
[INFO] [stdout]   3 |     types_compatible,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `types_compatible` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/type_checker.rs:134:1
[INFO] [stdout]     |
[INFO] [stdout] 134 | fn types_compatible(expected: &str, actual: &str) -> bool {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0624]: method `extract_parameter_names` is private
[INFO] [stdout]    --> tests/test_inlay_hints.rs:25:27
[INFO] [stdout]     |
[INFO] [stdout]  25 |     let params = provider.extract_parameter_names("(name: string, age: number) => void");
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^^^^ private method
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/lsp/inlay_hints/mod.rs:218:5
[INFO] [stdout]     |
[INFO] [stdout] 218 |     fn extract_parameter_names(&self, type_annotation: &str) -> Vec<String> {
[INFO] [stdout]     |     ----------------------------------------------------------------------- private method defined here
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0624]: method `extract_parameter_names` is private
[INFO] [stdout]    --> tests/test_inlay_hints.rs:28:27
[INFO] [stdout]     |
[INFO] [stdout]  28 |     let params = provider.extract_parameter_names("() => void");
[INFO] [stdout]     |                           ^^^^^^^^^^^^^^^^^^^^^^^ private method
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/lsp/inlay_hints/mod.rs:218:5
[INFO] [stdout]     |
[INFO] [stdout] 218 |     fn extract_parameter_names(&self, type_annotation: &str) -> Vec<String> {
[INFO] [stdout]     |     ----------------------------------------------------------------------- private method defined here
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `typescript-lsp` (test "test_type_checker") due to 6 previous errors
[INFO] [stdout] error[E0603]: function `check_keyword_usage` is private
[INFO] [stdout]    --> tests/test_syntax_checker.rs:2:29
[INFO] [stdout]     |
[INFO] [stdout]   2 |     check_bracket_matching, check_keyword_usage, check_quote_matching, check_switch_statements, check_try_catch_statements,
[INFO] [stdout]     |                             ^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `check_keyword_usage` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:294:1
[INFO] [stdout]     |
[INFO] [stdout] 294 | fn check_keyword_usage(content: &str) -> Vec<Diagnostic> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] warning: build failed, waiting for other jobs to finish...
[INFO] [stdout] error[E0603]: function `check_switch_statements` is private
[INFO] [stdout]    --> tests/test_syntax_checker.rs:2:72
[INFO] [stdout]     |
[INFO] [stdout]   2 |     check_bracket_matching, check_keyword_usage, check_quote_matching, check_switch_statements, check_try_catch_statements,
[INFO] [stdout]     |                                                                        ^^^^^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `check_switch_statements` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:345:1
[INFO] [stdout]     |
[INFO] [stdout] 345 | fn check_switch_statements(content: &str) -> Vec<Diagnostic> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `typescript-lsp` (test "test_inlay_hints") due to 5 previous errors
[INFO] [stdout] error[E0603]: function `check_try_catch_statements` is private
[INFO] [stdout]    --> tests/test_syntax_checker.rs:2:97
[INFO] [stdout]     |
[INFO] [stdout]   2 |     check_bracket_matching, check_keyword_usage, check_quote_matching, check_switch_statements, check_try_catch_statements,
[INFO] [stdout]     |                                                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `check_try_catch_statements` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:392:1
[INFO] [stdout]     |
[INFO] [stdout] 392 | fn check_try_catch_statements(content: &str) -> Vec<Diagnostic> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: function `check_unused_imports` is private
[INFO] [stdout]    --> tests/test_syntax_checker.rs:3:5
[INFO] [stdout]     |
[INFO] [stdout]   3 |     check_unused_imports,
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^ private function
[INFO] [stdout]     |
[INFO] [stdout] note: the function `check_unused_imports` is defined here
[INFO] [stdout]    --> src/lsp/diagnostics/syntax_checker.rs:447:1
[INFO] [stdout]     |
[INFO] [stdout] 447 | fn check_unused_imports(content: &str) -> Vec<Diagnostic> {
[INFO] [stdout]     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0624]: method `extract_variable_name` is private
[INFO] [stdout]    --> tests/test_inlay_hints.rs:36:25
[INFO] [stdout]     |
[INFO] [stdout]  36 |     assert_eq!(provider.extract_variable_name("const myVar = 123"), Some("myVar".to_string()));
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^ private method
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/lsp/inlay_hints/mod.rs:311:5
[INFO] [stdout]     |
[INFO] [stdout] 311 |     fn extract_variable_name(&self, line: &str) -> Option<String> {
[INFO] [stdout]     |     ------------------------------------------------------------- private method defined here
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0624]: method `extract_variable_name` is private
[INFO] [stdout]    --> tests/test_inlay_hints.rs:37:25
[INFO] [stdout]     |
[INFO] [stdout]  37 |     assert_eq!(provider.extract_variable_name("let count = 0"), Some("count".to_string()));
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^ private method
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/lsp/inlay_hints/mod.rs:311:5
[INFO] [stdout]     |
[INFO] [stdout] 311 |     fn extract_variable_name(&self, line: &str) -> Option<String> {
[INFO] [stdout]     |     ------------------------------------------------------------- private method defined here
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0624]: method `extract_variable_name` is private
[INFO] [stdout]    --> tests/test_inlay_hints.rs:38:25
[INFO] [stdout]     |
[INFO] [stdout]  38 |     assert_eq!(provider.extract_variable_name("var _private = true"), Some("_private".to_string()));
[INFO] [stdout]     |                         ^^^^^^^^^^^^^^^^^^^^^ private method
[INFO] [stdout]     |
[INFO] [stdout]    ::: src/lsp/inlay_hints/mod.rs:311:5
[INFO] [stdout]     |
[INFO] [stdout] 311 |     fn extract_variable_name(&self, line: &str) -> Option<String> {
[INFO] [stdout]     |     ------------------------------------------------------------- private method defined here
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] For more information about this error, try `rustc --explain E0603`.
[INFO] [stdout] 
[INFO] [stdout] For more information about this error, try `rustc --explain E0624`.
[INFO] [stdout] 
[INFO] [stdout] For more information about this error, try `rustc --explain E0603`.
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `typescript-lsp` (test "test_syntax_checker") due to 4 previous errors
[INFO] [stdout] error[E0603]: module `collector` is private
[INFO] [stdout]  --> tests/test_symbols_collector.rs:1:35
[INFO] [stdout]   |
[INFO] [stdout] 1 | use typescript_lsp::lsp::symbols::collector::{SymbolCollector, SymbolKind};
[INFO] [stdout]   |                                   ^^^^^^^^^ private module
[INFO] [stdout]   |
[INFO] [stdout] help: consider importing this struct instead:
[INFO] [stdout]       typescript_lsp::SymbolCollector
[INFO] [stdout]  --> tests/test_symbols_collector.rs:1:47
[INFO] [stdout]   |
[INFO] [stdout] 1 | use typescript_lsp::lsp::symbols::collector::{SymbolCollector, SymbolKind};
[INFO] [stdout]   |                                               ^^^^^^^^^^^^^^^
[INFO] [stdout] note: the module `collector` is defined here
[INFO] [stdout]  --> src/lsp/symbols/mod.rs:5:1
[INFO] [stdout]   |
[INFO] [stdout] 5 | mod collector;
[INFO] [stdout]   | ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] error[E0603]: module `collector` is private
[INFO] [stdout]  --> tests/test_symbols_collector.rs:1:35
[INFO] [stdout]   |
[INFO] [stdout] 1 | use typescript_lsp::lsp::symbols::collector::{SymbolCollector, SymbolKind};
[INFO] [stdout]   |                                   ^^^^^^^^^ private module
[INFO] [stdout]   |
[INFO] [stdout] help: consider importing this enum instead:
[INFO] [stdout]       typescript_lsp::SymbolKind
[INFO] [stdout]  --> tests/test_symbols_collector.rs:1:64
[INFO] [stdout]   |
[INFO] [stdout] 1 | use typescript_lsp::lsp::symbols::collector::{SymbolCollector, SymbolKind};
[INFO] [stdout]   |                                                                ^^^^^^^^^^
[INFO] [stdout] note: the module `collector` is defined here
[INFO] [stdout]  --> src/lsp/symbols/mod.rs:5:1
[INFO] [stdout]   |
[INFO] [stdout] 5 | mod collector;
[INFO] [stdout]   | ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] For more information about this error, try `rustc --explain E0603`.
[INFO] [stdout] 
[INFO] [stderr] error: could not compile `typescript-lsp` (test "test_symbols_collector") due to 2 previous errors
[INFO] running `Command { std: "docker" "inspect" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367", kill_on_drop: false }`
[INFO] [stdout] 5689ecfb898790b12aee9ab3f42cc144dc616e07b67b14d10f73834f46b84367
